zukucode
主にWEB関連の情報を技術メモとして発信しています。

Docker ComposeでDockerfileをビルドする際に親ディレクトリのファイルをコピーする

Docker ComposeDockerfileをビルドする際に、親ディレクトリのファイルをコピーしたいときがあります。

例えば以下のようなフォルダ構成のときです。

  • 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.ymlbuildの設定で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のビルド時にプロジェクト全体のファイルを参照できるようになります。


関連記事