2017-01-13 6 views
6

私はドッカーファイルを作成してドキュメントを読んで遊んでいましたが、私はこの質問に疑問を抱いていました:ドッキングファイルにEXPOSEコマンドを追加するとレイヤが追加されますか? (なぜそれがファイル内のどこに置かれているのかは気になりますか?)Docker EXPOSEは新しいレイヤーを作成しますか?

documentationでは特に言及されていません。

ファイルシステムが変更されるため、RUN、COPY、およびADDはレイヤを作成することを理解しています。公開すると、メタデータがコンテナに追加されるだけで、レイヤが生成されますか?

答えて

6

はい、Dockerfile内のすべての命令は、結果の画像用に新しいレイヤーを生成します。

ただし、EXPOSEで作成されたレイヤーは、空きレイヤーです。つまり、そのサイズは0バイトです。

のうち、はストレージに影響を与えませんが、レジストリからイメージを構築またはプル/プッシュする際にレイヤーキャッシュを活用することになります。

画像のレイヤーを理解するには、docker historyコマンドを使用することをお勧めします。たとえば、次のようDockerfileを与えられた:

IMAGE    CREATED    CREATED BY       SIZE    COMMENT 
ab9f435de7bc  4 seconds ago  /bin/sh -C#(nop) EXPOSE 4000/tcp 0 B     
15e09691c313  5 seconds ago  /bin/sh -C#(nop) EXPOSE 3000/tcp 0 B  

をあなたはEXPOSEステートメントの順序を切り替える場合:あなたは、あなたが表示されますdocker history test/image場合

FROM scratch 

EXPOSE 4000 
EXPOSE 3000 

docker build -t test/image .

を行います再度ビルドすると、レイヤーキャッシュは無視されます。

+0

しかし、私が 'docker inspect test/image'を実行すると、それらをレイヤーとして見ることはできません。しかし、彼らはまだ最終結果画像のための余分な 'データ'を生成しますか? –

+0

はい、イメージメタデータですが、ファイルシステムの差分ではありません。通常、あなたのdevの幸福を最大にするために、Dockerfilesの最後に 'CMD'の前に' EXPOSE'命令を使いたいとします。 – gvilarino

2

すべての命令は新しいレイヤーを作成しますが、ファイルシステムを変更しない命令は空のレイヤーを作成します。

hereまたはhere for AUFSについて読むことができるDockerのファイルシステムレイヤーの仕組みを調べる価値があります。

ファイルシステム上の本質的に新しいレイヤーは、その下のレイヤーから変更されたファイルで作成されます。これはdiffのスタックのようなものです。したがって、変更がなければ、作成するレイヤはありません。ほとんど...

Dockerfileのすべての命令は画像レイヤーを作成しますが、AUFS(EXPOSEの場合)のレイヤーは空になります(下位レイヤーとの違いはありません)。

+0

私は、2つの 'ENV'コマンドをお互いに実行すると、1つの行でそれらを実行するのと同じ結果(レイヤーで)が得られることが分かりました。 –

+1

うーん、それは面白いです。私は確かにその動作を取得していません。連続したnopコマンドを1つのレイヤにまとめることについての議論がありましたが、まだ完了していないと思います。 –

+0

私は間違っていました。私はファイルシステムのレイヤーしかチェックしていませんでした。 'docker history'で確認すれば実際に別のレイヤーを作成します。 –

1

私は自分自身でこれをテストできることに気付きました。 EXPOSEを追加すると新しいファイルシステムレイヤーが追加されないことがわかりましたが、レイヤーを少なくしたり、キャッシュレイヤーのドッカーファイルをどの順序で作成しても問題ありません。

基本的に:すべてのコマンドは新しいレイヤーを作成し、ファイルシステムを変更するすべてのコマンドはファイルシステムレイヤーを作成します。 (開発環境で言う)を複数回実行すると

FROM ... 
COPY smthing . 
EXPOSE 80 

FROM ... 
EXPOSE 80 
COPY smthing . 

は異なっています。

EXPOSEコマンドはキャッシュされ、smthingファイルが変更されても実行されません。何かのファイルが変更された場合、docker buildはこのコマンドだけを再実行します(残りはキャッシュから取得されます)。

第2の例では、 smthingファイルが変更された場合、EXPOSEコマンドも再構築されます。 (コピーコマンドの後のすべてが無効化され、docker buildで再実行されるため)。

最初のケースでは、2番目の例ではないcopyコマンドを再実行する必要があるEXPOSEポートを変更しますか。

しかし、どちらも同じ最終結果ファイルシステム層に賢明につながります。

docker inspect imageName #shows the file system layer 
docker history imageName #shows all the layers 
関連する問題