質問: dockerのイメージを縮小したいと思っています。 ``` test/i386-ubuntu 1.1.4 86ce872ce959 3 days ago 8.682 GB test/i386-ubuntu 1.1.3 7f25a5c2b7ee 3 days ago 7.284 GB test/i386-ubuntu 1.1.2 a8177a2a57ea 3 days ago 2.012 GB test/i386-ubuntu 1.1.1 58ff7a098c5f 3 days ago 381.7 MB ``` 上記4つのイメージは階層構造になっています。この1.1.4から不要ファイルを削除して新たなイメージで縮小したいと考えています。 docker exportだとメタファイルは削除されるという記事も見ました。このメタファイルというのが何を指すのかよく理解していませんが、意図しないファイルが消えることは避けたいと思っています。 どうすればイメージをまとめダイエットしたイメージが作成できるのでしょうか? ご存知の方、メタファイルようなファイルを言っているのかとあわせ、ご教示お願います。
回答: 小さいDockerイメージを作る最良の方法は、Alpine LinuxやBusyBox等の小さいベースイメージに必要最小限の変更を加えたイメージをビルドしなおすことです。 けど多分これはやりたいことではないでしょうから、別の方法を挙げます。 Dockerイメージのサイズが大きくなる原因はレイヤー数の増加です。 `test/i386-ubuntu:1.1.4`は`1.1.1`からレイヤーを重ねているためサイズが大きくなっています。 このイメージの上で何をしようともサイズが小さくなることはありません。 サイズを小さくするには、レイヤーをまとめて一階層にした新しいイメージを作るしかないと思います。 レイヤーをまとめる機能はまだDockerにはありません。 PR #13929やPR #4232で提案されましたが、却下されたようです。 PR #22641は`docker build`に`--squash`というオプションを加えるもので、すでにマージされていますし、 レイヤーをまとめるのに使えそうですが、まだリリースされていないようです。 サードパーティ製のdocker-flattenやdocker-squashがありますが、利用は自己責任でということになります。 ほかには`docker export`と`docker import`を使う方法があります。 ``` docker export <コンテナ ID> | docker import - <イメージ名>:<タグ> ``` ただしこれをやると、`docker build`(Dockerfile)でイメージに付与した属性が消えてしまいます。 例えば`VOLUME`、`EXPOSE`、`ENV`などです。保持されるのはファイルシステムだけと考えておけばいいと思います。 `docker export`の対象はイメージではなくコンテナである点に注意してください。 イメージを対象とした似たコマンドに`docker save`/`docker load`がありますが、これはレイヤーをまとめず保持するのでイメージサイズ縮小には使えません。 `docker export`前に、コンテナ内で不要なファイルやパッケージを削除したり、`apt-get clean`でキャッシュを削除しておくと、より小さいイメージを作れます。