Dockerでモノレポのpackage.jsonをいい感じにコピーする(ディレクトリ構造を維持しつつコピーする)
Dockerについて半日ぐらい調べたときの成果3。COPY --parents
について。
モノレポ環境でDockerのビルドをしたい時に、yarn install
をしたい場合、2つほど問題が発生する。
- 他パッケージに依存しているときはモノレポのルートでCOPYをする必要がある
yarn install --immutable
をする場合は、すべてのモノレポのpackage.json
が必要
上記を解決するためには、モノレポのルートをビルドコンテキストとして指定する必要がある。そこで各パッケージのpackage.json
をコピーしたいが、COPY ./packages/*/package.json .
のようなコピーの方法は使えない。というのもこれだと./packages/backend/package.json
を./package.json
にコピーした後./packages/frontend/package.json
を./package.json
にコピーする、という感じの動作になる。つまり、最後にコピーしたpackage.json
が残る。これを解決するのにはCOPY ./packages/backend/package.json ./packages/backend/package.json
のように、コピー元とコピー先を指定する必要がある。これだとパッケージが増える度に指定する必要がある。
そこで**COPY --parentsを利用する。これはコピー元の親ディレクトリを保持したままコピーしてくれる**、上記の課題を解決してくれるすぐものだ。
COPY --parents ./packages/*/package.json ./
とやると、./packages/backend/package.json
を./packages/backend/package.json
にコピーし、./packages/frontend/package.json
を./packages/frontend/package.json
にコピーする、という動作になる。
ドキュメントに記載通りだが、上記はstableな機能ではないため、# syntax=docker/dockerfile:1.7-labs
を先頭に扶養する必要がある。