2018/06/24

docker build で作成した image の layer を統合してサイズを縮小する

Docker で Dockerfile を書いて image を build すると、 RUN したコマンド毎に layer ができます。
結果、次回 build 時にコマンドを再実行せず、layer を cache として使って build 時間の短縮ができます。
また、build に失敗した場合でも、layer の id を指定して docker run して原因特定、などができます。
などなど、 RUN ごとに layer を作成することには多くのメリットがあります。
ですが、'毎回 layer を作成する == 全コマンド結果保存' ということでもあるので、image のサイズが大きくなります。

ビルドする側からすると、全 layer を保存しても問題無いと思います。
ですが、ダウンロードする側、特に何度もダウンロードが発生する場合はサイズが小さいほど良い。
例えば dockerhub にイメージを登録する場合がありますね。
image 作成過程の試行錯誤を dockerhub に登録して、ダウンロード容量が大きくなるとよろしくない。

と、いうことで、layer を統合してサイズを抑えてみます。


環境

  • OS: macOS Sierra 10.12.6
  • Docker for mac: 18.03.1-ce, build 9ee9f40


export/import

と、言ったはものの、同じ考えをしている方がまとめていました
export/import すれば layer を統合できます。
統合というか結果的に1 layer になる、という言い方が正確です。
具体的なコマンドはこんな感じ。
  • $ docker run -itd --name nya big-image
  • $ docker export nya > nya.tar
  • $ cat nya.tar | docker import - big-image-single:latest
今回試してみた image では、57 layers(13GB) -> 1 layer(9GB) になりました。
イメージの性質による思いますが、なかなか効果がありますね。
ちなみに、image save/image import をすると全 layer 含めて export するので縮小はできません。


参考

0 件のコメント:

コメントを投稿