Docker ComposeでDockerfileをビルドする際に親ディレクトリのファイルをコピーする
Docker ComposeでDockerfileをビルドする際に、親ディレクトリのファイルをコピーしたいときがあります。
例えば以下のようなフォルダ構成のときです。
- web
- Dockerfile
- frontend
- src(フロントエンドのソース)
- package.json
- docker-compose.yml
docker-compose.ymlversion: '3'
services:
web:
build: ./webwebフォルダのDockerfileでは、frontendフォルダのソースをコピー・ビルドをして、nginxのWEBサーバーに配置するを実装しています。
DockerfileFROM 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/frontDockerfileでは自身のディレクトリ配下のファイルしか参照できないという制約があります。
そのため、上記の処理を実行すると4行目でエラーになってしまいます。
対処法
docker-compose.ymlのbuildの設定でcontextを指定します。
dockerfileのパスはファイル名(Dockerfile)まで指定してください。
docker-compose.ymlversion: '3'
services:
web:
build: ./web
build:
context: .
dockerfile: ./web/Dockerfile上記のように設定すると、Dockerfileでビルド時のパスの起点が.(docker-compose.ymlと同じ階層)になります。
次にDockerfileを修正します。
コピーするファイルのパスをdocker-compose.ymlと同じ階層からたどるように指定します。
DockerfileFROM 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のビルド時にプロジェクト全体のファイルを参照できるようになります。