2017-04-19 2 views
3

この公式のドッカーでは、userguideのアドバイスの1つがDockerfileのレイヤーの数を最小限に抑えていました。Dockerfileのレイヤーの数を最小限にする

私はそれが画像の合計サイズ減少であることを思ったが、層の最大の制限についての何かを見つけました:Number of commands in Dockerfile

しかし、理由のキャッシングの別々のコマンドを分割するために非常に有用です。例えば

、このようDockerfileを持っている:これはそう、一度構築されて一層のみ、です

# https://hub.docker.com/_/php/ 
FROM php:5.5.23-fpm 

RUN /scripts/base.sh \ 
&& /scripts/composer.sh \ 
&& /scripts/mbstring.sh \ 
&& /scripts/bcmath.sh \ 
&& /scripts/mcrypt.sh \ 
&& /scripts/sockets.sh \ 
&& /scripts/zip.sh \ 
&& /scripts/phpredis.sh \ 
&& /scripts/cleanup.sh 

、それがキャッシュされます。しかし、たとえばphpredisのバージョンを変更すると、各ステップが再び構築されます。

別々のRUN命令に分割することはできますか?それは私に助言することができますか?

答えて

1

最初にRUNがキャッシュされます

/scripts/phpredis.sh \ && /scripts/cleanup.sh

を含む第二RUNを持っている場合。 1.13のような最近のドッキングウィンドウのバージョンで

、あなたは

docker build --squashは、ドキュメントを参照してい

https://docs.docker.com/engine/reference/commandline/build/#options

+0

これは抽象的な問題を解決しません。各* .shは別々に更新することができます。 'cleanup.sh'は例外ではありません。 – Aliance

+1

あなたはいくつかの実行することができます、私は恐れているより良い方法はありません – user2915097

4

Dockerfile "デザイン" は、主に、あなたのニーズに依存し、何を両立したいです。レイヤーの数を最小限に抑えることがベストプラクティスと考えられますが、既に述べたように、キャッシュは明示的に新しいレイヤーを作成することで機能します。限られた数の層でリンクされた問題は、より大きなDockerfilesで問題になる可能性がありますが、それはシステムの構成済みのストレージドライバによっても異なります。 Dockerファイルの例(各スクリプトがそれ自身のRUNステートメントでも)はレイヤーの限界に達していないので、心配する必要はありません。

つまり、レイヤーキャッシュの仕組みを完全には理解していなかったと思います(完全なDockerfileを投稿していない可能性があります)。 DockerはRUNステートメント中にスクリプトが生成するファイルシステムの変更を認識しません。したがって、DockerビルドをそのDockerfileで再実行すると、Dockerはスクリプトを再度実行しません。 phpredisのバージョンが変更される可能性がありますが、Dockerfileにその変数が反映されていないことを例として説明しました。関連するRUNの前に変数ENVを宣言することをお勧めします。例:

# https://hub.docker.com/_/php/ 
FROM php:5.5.23-fpm 

RUN /scripts/base.sh \ 
&& /scripts/composer.sh \ 
&& /scripts/mbstring.sh \ 
&& /scripts/bcmath.sh \ 
&& /scripts/mcrypt.sh \ 
&& /scripts/sockets.sh \ 
&& /scripts/zip.sh \ 
&& /scripts/cleanup.sh 

ENV PHPREDIS_VERSION=1.2.3 

RUN /scripts/phpredis.sh \ 
&& /scripts/cleanup.sh 

phpredis.shは環境変数を使用する必要があります。 ENV ...ステートメントを変更するたびに、Dockerはそのステップの後のすべてのステートメント(phpredis.shスクリプトを含む)を再実行します。

最近発表されたmulti stage buildsは、画像を小さく保ち、cleanup.shスクリプトの必要性を減らす方法を再設計するのに役立つかもしれません。

関連する問題