Dockerイメージに追加された後に削除されたファイルを検索する方法は?

Dockerイメージに追加された後に削除されたファイルを検索する方法は?

次の作業ディレクトリがあるとします。

$ 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"
]

上記はjqJSONデータを照会するためのツールです。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ストレージドライバ(現在はすべてではありませんが、ほとんどのプラットフォームではデフォルトドライバ)を使用しているとします。別のドライバを使用すると、ディスクのレイアウトが異なります。

おすすめ記事