Dockerの multi-stage builds を使ってみた

背景

Node.jsで生成した生成したテキストファイルをphpで扱いたい時があった。 手元の環境にphpとNode.jsを入れたくない(&他の開発者も扱いやすくしたい)ので、コンテナで実行することにした。 公式のphpイメージにNode.jsを入れるよりもステージ間で成果物をやり取りできたほうが嬉しいので、multi-stage buildsを試してみた。

やったこと

最初は直列に書いてみたがうまく行かなかった。 FROM命令でステージが初期化されてしまうため、ファイルを引き継げないと思われる。

The FROM instruction initializes a new build stage and sets the Base Image for subsequent instructions. docs.docker.com

下記ドキュメントに書いてあるとおり、COPY --fromを用いてステージを指定することでそのイメージ上で作られたファイルを参照できる。 docs.docker.com

これでステージ間での受け渡しができた。

FROM node:latest AS node
ADD . /hoge
WORKDIR /hoge
RUN npm -v
RUN touch test.txt
RUN npm -v >> test.txt

FROM php:latest
COPY --from=node /hoge/test.txt /fuga/test.txt
WORKDIR /fuga
CMD ls -la && cat test.txt