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`を実行するのが本来の姿であるような気がするのだが、これだけ差が出ているとせめてグループ毎には纏めてしまおうと思い直すことになった。
以上。