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を先頭に扶養する必要がある。
