Container Image Size

Dockerの表題の件について、前から少し気になっていたので試してみた。

■ 環境

  • Docker 1.10.3
  • Docker Machine 0.6.0
  • Mac OSX El Capitan

■ 気になっていた点

公開されているDockerfileを見ていると、`RUN`がすごく少なく`&&`でコマンドを繋げているのを多々見かける。`RUN`毎にlayerが増えていくのを防ぐ為、というようなものを読んだことがあるが実際にどの程度変わるのかを試してみる。

■ Dockerfile1

以前作成したApache ZooKeeperのDockerfileを使用する。まずは下記。

FROM centos:7
MAINTAINER withsin <withsin@gmail.com>

ENV ZOO_VERSION=3.4.8

RUN yum update -y
RUN yum install -y java-1.8.0-openjdk
RUN curl http://archive.apache.org/dist/zookeeper/zookeeper-${ZOO_VERSION}/zookeeper-${ZOO_VERSION}.tar.gz | tar zx -C /opt
RUN ln -s /opt/zookeeper-${ZOO_VERSION} /opt/zookeeper
RUN mkdir /opt/zookeeper/data
RUN chown -R root:root /opt/zookeeper-${ZOO_VERSION}
RUN mv /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
RUN yum clean all

EXPOSE 2181 2888 3888

CMD ["/opt/zookeeper/bin/zkServer.sh", "start-foreground"]

このDockerfileをビルドする。

docker build -t test1 .

■ Dockerfile2

続いてコマンドの塊毎に`RUN`をひとつにしてみた。個人的にまとめるとしたらこの範囲かな、というのを一つのグループとしている。

FROM centos:7
MAINTAINER withsin <withsin@gmail.com>

ENV ZOO_VERSION=3.4.8

RUN yum update -y \
    && yum install -y java-1.8.0-openjdk
RUN curl http://archive.apache.org/dist/zookeeper/zookeeper-${ZOO_VERSION}/zookeeper-${ZOO_VERSION}.tar.gz | tar zx -C /opt \
    && ln -s /opt/zookeeper-${ZOO_VERSION} /opt/zookeeper \
    && mkdir /opt/zookeeper/data \
    && chown -R root:root /opt/zookeeper-${ZOO_VERSION} \
    && mv /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
RUN yum clean all

EXPOSE 2181 2888 3888

CMD ["/opt/zookeeper/bin/zkServer.sh", "start-foreground"]

ビルドする。

docker build -t test2 .

■ 結果

イメージサイズの違いを見る。

$ docker images
REPOSITORY   TAG      IMAGE ID       CREATED             SIZE
test2        latest   17a2170391d5  12 minutes ago      458.3 MB
test1        latest   33ba6c2afcad  28 minutes ago      571.7 MB
  :

100M以上の差が出た。

コマンド毎に`RUN`を実行するのが本来の姿であるような気がするのだが、これだけ差が出ているとせめてグループ毎には纏めてしまおうと思い直すことになった。

以上。

■ 関連