Docker ComposeでDockerfileをビルドする際に親ディレクトリのファイルをコピーする
Docker Compose
でDockerfile
をビルドする際に、親ディレクトリのファイルをコピーしたいときがあります。
例えば以下のようなフォルダ構成のときです。
- web
- Dockerfile
- frontend
- src(フロントエンドのソース)
- package.json
- docker-compose.yml
docker-compose.yml
version: '3'
services:
web:
build: ./web
webフォルダのDockerfile
では、frontendフォルダのソースをコピー・ビルドをして、nginx
のWEBサーバーに配置するを実装しています。
Dockerfile
FROM node as build-stage
# frontendのソースをビルド
ADD ../frontend/package*.json ./
RUN npm install
COPY ../frontend .
RUN npm run build
FROM nginx as production-stage
RUN mkdir /var/www
RUN mkdir /var/www/front
COPY --from=build-stage /code/build /var/www/front
Dockerfile
では自身のディレクトリ配下のファイルしか参照できないという制約があります。
そのため、上記の処理を実行すると4行目でエラーになってしまいます。
対処法
docker-compose.yml
のbuild
の設定でcontext
を指定します。
dockerfile
のパスはファイル名(Dockerfile
)まで指定してください。
docker-compose.yml
version: '3'
services:
web:
build: ./web
build:
context: .
dockerfile: ./web/Dockerfile
上記のように設定すると、Dockerfile
でビルド時のパスの起点が.
(docker-compose.yml
と同じ階層)になります。
次にDockerfile
を修正します。
コピーするファイルのパスをdocker-compose.yml
と同じ階層からたどるように指定します。
Dockerfile
FROM node as build-stage
# frontendのソースをビルド
ADD ../frontend/package*.json ./
RUN npm install
COPY ../frontend .
RUN npm run build
# frontendのソースをビルド
ADD ./frontend/package*.json ./
RUN npm install
COPY ./frontend .
RUN npm run build
FROM nginx as production-stage
RUN mkdir /var/www
RUN mkdir /var/www/front
COPY --from=build-stage /code/build /var/www/front
これで、Dockerfile
のビルド時にプロジェクト全体のファイルを参照できるようになります。