docker
Dockerのマルチステージビルド
Dockerについて半日ぐらい調べたときの成果1。マルチステージビルドについて。
公式ドキュメント以上や、その他既にたくさんある記事以上の情報はないが、少なくとも令和のDockerfileでは必須な知識だと思う。
下記のように、FROMが2個以上出てくるのが特徴だ。例えばWebpackによりバンドルしたファイルをnodeで実行するときなんかにとても効力を発揮する。
FROM node:22 AS build
WORKDIR /app
COPY . .
RUN npm install && npm run build
FROM node:22 AS runtime
WORKDIR /app
COPY /app/dist /app/dist
CMD ["node", "dist/index.js"]
ステージというのは簡単に言えばFROMで定義したイメージのことで、上記ではビルドと実行の2つのステージがある。Dockerの最終的な成果物は最後のステージのイメージになる。この場合はruntime
ステージだ。
COPY --from
により異なるステージの中で生成されたファイルをコピーできる。上記では最終的に実行に必要なバンドル後のapp/dist
ディレクトリをruntime
ステージにコピーしている。
これの最大の利点は最終的な成果物のサイズが小さくなることだ。1つのステージしかなければ(明示的に削除しない限り)node_modules
やsrc
など不要なファイルがふくまる。とくにnode_modules
なんかはデカくなりがちであるため、これを削除することでイメージのサイズを小さくできる。