2018年7月5日木曜日

Dockerfile に ADD or COPY してしまった分の容量増がどうしても気になるとき

どうもたなじゅんです。

久しぶりの技術ネタでの投稿です。

Dockerfile に、ADD や COPY を書かざるを得ない事情を持たれている方は少なからずいらっしゃると思います。(特に公開URLから素直にダウンロードできないような場合)

ADD や COPY で書かれたファイルの容量は、Docker の仕組み上、その後そのファイルを削除したとしても容量は減りません。(レイヤが増えてしまった後に消してもダメなので)

割り切れるサイズなら良いのですが、ADD/COPY するファイルがギガ単位だったりすると流石に無視するのは難しいのではないかと思います。

そんな時に有効なオプションとして、--squash オプションを付与することで Dockerfile 内に作成されるレイヤを一つに纏める(押しつぶす)ことができます。

例えば、EDB Postgres の場合であれば、


FROM centos:latest

ENV WEBUSERNAME=ほげ(入力してね)

ENV WEBPASSWORD=ぱすわーど(入力してね)
 

COPY edb-as10-server-10.x.x-1-linux-x64.run .

RUN set -x && \
chmod +x edb-as10-server-10.x.x-1-linux-x64.run && \
sync && \
./edb-as10-server-10.x.x-1-linux-x64.run --mode unattended --enable-components server,commandlinetools --disable-components pgadmin4,stackbuilderplus --superaccount enterprisedb --serviceaccount enterprisedb --servicename edb-as-10 --prefix /opt/edb/as10 --datadir /opt/edb/as10/data --xlogdir /opt/edb/as10/data/pg_wal --superpassword enterprisedb --serverport 5444 --locale ja_JP.utf8 --create_samples no --server_utilization 33 --workload_profile oltp --webusername $WEBUSERNAME --webpassword $WEBPASSWORD && \
rm -f edb-as10-server-10.x.x-1-linux-x64.run 


EXPOSE 5444
 
 のような Dockerfile があるときに、docker build するだけだと、edb-as10-server-10.x.x-1-linux-x64.run の分は普通に image の容量としてそのまま残ってしまいます(COPY のレイヤーと、RUN の中でファイルを rm した時のレイヤーが異なるためです)。

このような場合に、squashオプションを使うことで、レイヤーを一つにまとめることが出来、結果として容量を削減することが可能です。

$ docker build --squash=true -t edb .

みたいにオプションを付けるだけ。
ちなみに、docker 起動時に、"--experimental=true" オプションが必要です。
ubuntu であれば、/etc/default/docker の DOCKER_OPTS あたりに追加してください

デメリットとしてはレイヤーを纏めた結果として image の履歴は追うことが出来なくなりますので、ご注意ください。

余談となりますが、Dockerfile 内で sync を掛けているのは、それをしないと実行権限が即座に反映されなかったためです。苦笑
Dockerfile で直前のコマンドが反映されていないような場合によくやります。。。。

※参考
https://qiita.com/RyoMa_0923/items/193d2c18addc240c04b5

0 件のコメント:

コメントを投稿