
次の作業ディレクトリがあるとします。
$ tree .
.
├── Dockerfile
└── file.txt
以下Dockerfile
を含みます。
FROM debian:9
WORKDIR /usr/src/foo
COPY file.txt .
RUN echo Some random command involving file.txt \
&& rm -f file.txt
次に、そのイメージをビルドし、指定されたDockerレジストリにプッシュします。
$ docker build -t foo/bar .
$ docker login #…
$ docker push foo/bar
file.txt
画像から追加されたコンテンツを検索して中間層から削除する方法はありますか?答えは選択によって異なりますかWORKDIR
?
答え1
中間層に追加され、削除されたfile.txtの内容を画像から取得する方法はありますか?
はい!
答えはWORKDIRの選択によって異なりますか?
いいえ。WORKDIR
現在の作業ディレクトリを変更する以外は何もしません。
Dockerfileからイメージを構築すると、Dockerfileの各コマンドは新しいレイヤーを作成します。 「画像」は、コンテナが実行されるときにコンテナのファイルシステムを形成するために単に結合されるレイヤの集合である。これらの各レイヤーは、On Diskの下に個別に見つけることができます/var/lib/docker
。たとえば、次のDockerfileを使用して画像を構築するとします。
FROM debian:9
COPY file.txt /root/file.txt
RUN rm -f /root/file.txt
file.txt
そのディレクトリには、次のテキストを含むファイルがあります。
hello world
を実行すると、docker build -t erikmd .
次のようになります。
Sending build context to Docker daemon 3.072kB
Step 1/3 : FROM debian:9
---> d508d16c64cd
Step 2/3 : COPY file.txt /root/file.txt
---> Using cache
---> 6f06029c1cca
Step 3/3 : RUN rm -f /root/file.txt
---> Using cache
---> a2dc62c823c9
Successfully built a2dc62c823c9
Successfully tagged erikmd:latest
ビルドプロセスの各ステップは新しいレイヤーを作成します。そしてこれまで、すべてのDockerfileコマンドの結果である中間イメージを表すイメージIDを提供します。 about 出力が与えられたら、以下を実行できます。
$ docker run --rm 6f06029c1cca cat /root/file.txt
そしてファイルの内容を見る。
hello world
しかし、もし私がいいえイメージだけを作成しますか?この場合、まず、docker image inspect
次のコマンドを使用して画像を構成するレイヤーのリストを確認します。
$ docker image inspect erikmd | jq '.[0].RootFS.Layers'
[
"sha256:13d5529fd232cacdd8cd561148560e0bf5d65dbc1149faf0c68240985607c303",
"sha256:41494b03ef195ce6db527bd68b89cbebdace66210b4c142e95f8553fcb0bf51e",
"sha256:1948a4bd00b6f1712667bb2c68d1fe6eb60fbbcdf8bad62653208c23bf2602a5"
]
上記はjq
JSONデータを照会するためのツールです。docker image inspect
便利でない場合は、同じ情報の出力を直接目視で確認できますjq
。
ストレージドライバのデフォルトのDocker設定を使用していると仮定すると、次のようになりoverlay2
ます/var/lib/docker/image/overlay2/layerdb/sha256/*/diff
。
# grep -l 13d5529fd232cacdd8cd561148560e0bf5d65dbc1149faf0c68240985607c303 \
/var/lib/docker/image/overlay2/layerdb/sha256/*/diff
/var/lib/docker/image/overlay2/layerdb/sha256/13d5529fd232cacdd8cd561148560e0bf5d65dbc1149faf0c68240985607c303/diff
最初のレイヤーはdebian:9
イメージです。以下を実行してこれを確認できます。
$ docker image inspect debian:9 | jq '.[0].RootFS.Layers'
[
"sha256:13d5529fd232cacdd8cd561148560e0bf5d65dbc1149faf0c68240985607c303"
]
...だから無視します。 2番目のレイヤーを見てみましょう。
# grep -l 41494b03ef195ce6db527bd68b89cbebdace66210b4c142e95f8553fcb0bf51e \
/var/lib/docker/image/overlay2/layerdb/sha256/*/diff
/var/lib/docker/image/overlay2/layerdb/sha256/14347a192896a59fdf5c1a9ffcac2f93025433c66136d3531d7bbb3aec53efc7/diff
このファイルと同じディレクトリにdiff
次のファイルがありますcache-id
。
# cat image/overlay2/layerdb/sha256/14347a192896a59fdf5c1a9ffcac2f93025433c66136d3531d7bbb3aec53efc7/cache-id
118b1e4a401873e1db8849c0821d0280b4cf9ef621ccb70cf14fe672dc74ef75
これはcache-id
、レイヤーが抽出されたディレクトリを識別します。以下にあります/var/lib/docker/overlay2/<id>
。
# ls /var/lib/docker/overlay2/118b1e4a401873e1db8849c0821d0280b4cf9ef621ccb70cf14fe672dc74ef75
diff/ link lower work/
私たちはこのディレクトリの内容に興味がありますdiff/
:
# find /var/lib/docker/overlay2/118b1e4a401873e1db8849c0821d0280b4cf9ef6
21ccb70cf14fe672dc74ef75/diff/
/var/lib/docker/overlay2/118b1e4a401873e1db8849c0821d0280b4cf9ef621ccb70cf14fe672dc74ef75/diff/
/var/lib/docker/overlay2/118b1e4a401873e1db8849c0821d0280b4cf9ef621ccb70cf14fe672dc74ef75/diff/root
/var/lib/docker/overlay2/118b1e4a401873e1db8849c0821d0280b4cf9ef621ccb70cf14fe672dc74ef75/diff/root/file.txt
それだけです!
気づく上記のすべては、overlay2
ストレージドライバ(現在はすべてではありませんが、ほとんどのプラットフォームではデフォルトドライバ)を使用しているとします。別のドライバを使用すると、ディスクのレイアウトが異なります。