Docker のマルチステージビルド (Multi Stage Build) で Symbolic Link を使う


Dockerはサイズを小さくするために、builderと実際使うイメージでステージを分けて書くマルチステージビルド(multi-stage builds)がよく使われています。このマルチステージビルドを使う時、builderでライブラリをインストールし、実際使うイメージにライブラリをADDやCOPYで追加して使いたい場合があります。

ライブラリにはSymbolic Linkがよく含まれるのですが、DockerのADDやCOPYコマンドはSymbolic Linkを追加することは出来ません。

この問題は、builderで必要なSymbolic Linkをtarで固め、次のステージでtarファイルを展開することで意外と簡単に解決できます。

実際のDockerfileの例で詳しく見てみましょう。

Dockerfileの例と解説


FROM debian:latest as builder
RUN tar czf testlib.tar.gz /usr/local/lib/test.so.* \  
            /usr/local/lib/test1.so.* \
            /usr/local/lib/test2.so.* # 必要なSymbolic Linkをtarにする

FROM debian:latest
COPY --from=builder /testlib.tar.gz /testlib.tar.gz  # 固めたtarファイルをコピー
RUN cd / && tar xzf testlib.tar.gz # 固めたSymbolic Linkを展開

この方法を知るまでADDやCOPYでSymbolic Linkを追加しようと苦労したことが夢のようです。

参考