こんにちは!こんばんは!
今回はDockerfileで特定のイメージから特定のファイルをコピーする方法を紹介したいと思います!
まえがき
Dockerfileを書いていると特定のイメージから特定のファイルを今ビルドしているイメージ内に収めたいことが時々あります。
たとえば、Laravelの実行環境をDockerで作りたいってなったときに、Composerのイメージから composer
の実行ファイルをもらってきて、それを使ってcomposer install
したいといった使い方があるかと思います。
wgetなどを上手く使って、公開元のGitHubのレポジトリから取って来るなど様々なやり方があるかと思いますが、今回は公開されているイメージから特定のファイルのみをコピーする方法でやりたいと思います。
イメージ間のファイルのコピーは通常通りCOPYで出来る
今回はcomposer:2.2.7
のイメージからcomposerの実行ファイルを取ってきて、ビルドしている対象のイメージにcomposerをコピーしてインストールしてみます。
COPY --from=composer:2.2.7 /usr/bin/composer /usr/bin/composer
はい、なんとこれだけで出来ます。
マルチステージビルドをしていると同じ書き方で別のステージからファイルを持ってくるやり方がありますが、これと似た書き方でDocker Hub上で公開されているイメージからファイルを取ってくることが出来ます。
どういう時に使うか?
個人的には特にマルチアーキテクチャ(x86_64、aarch64等)に対応したイメージをビルドしたいときには特に使える技じゃないかと思います。
たとえば、ビルド済みのバイナリを特定のイメージから取ってきて入れたいといったときには、対象のアーキテクチャを意識する必要があります。
今回の方法だとコピー元のイメージがビルド対象のアーキテクチャに対応していれば、何も指定しなくてもそのまま合ったものを取ってきてくれるので考えることが一つ減って嬉しいですね。
さいごに
今回の手法を使うことで、wgetや複雑なワンライナーを使う必要すらなく簡単にファイルをコピーすることが出来ました。
是非、Dockerfileを書く時に活用してみてください!