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を追加しようと苦労したことが夢のようです。
参考
- [香川研究室でのDockerの使い方: シンボリックリンクに関する Tips] (http://guppy.eng.kagawa-u.ac.jp/Seminar/docker.html)
- How to make a symlinked folder appear as a normal folder