Armadilloフォーラム

"podman rmi -f"コマンドによるコンテイメージ削除について

h-yuusuke

2022年3月15日 10時42分

お世話になっております。

掲題の件について教えて頂きたいことがあります。

・コンテナイメージ「localhost/container1:1.0.0」と、「podman_partial_image」コマンドで作成した差分ファイルでアップデートされたコンテナイメージ「localhost/container1:1.0.1」が同時に存在する状態で、「podman rmi -f localhost/container1:1.0.0」コマンドを実行して古い方のコンテナイメージ(1.0.0の方)を削除した時、「-f」オプションにより新旧コンテナイメージで共通するコンテナイメージまで削除してしまうことはありますでしょうか?

もしあり得る場合、適切なコンテナイメージ削除コマンドは何でしょうか?

コメント

at_dominique.m…

2022年3月15日 11時40分

h-yuusukeさん、

お世話になっています。

答える前に、運用の時のイメージの管理について説明します。(podman_switch_storage --diskしてpodman image load/rmを使わないで、swuでイメージを配信する管理のこと)

アップデートの際に、以下のステップで更新します:
- podman のイメージディレクトリをコピーします("snapshot"なので、容量に影響がありません。その時に前のバージョンのコピーも消します。)
- swuの中身をインストールします
- /etc/atmark/containers/*.conf に使われてないイメージがあれば、podman image untagで名前を外します。コンフィグファイルがない場合に何も消しません。
- podman image pruneで名前のないイメージを消します。

なので、普段 swu でアップデートを行っていれば:
- ロールバックの際に古いイメージを使えます、
- 必要ないイメージが自動的に消されますので、今回の例の場合はcontainer1:1.0.0にだけあった部分が消されます。

そのプロセスに何か不満なところがあれば教えてください。

> ・コンテナイメージ「localhost/container1:1.0.0」と、「podman_partial_image」コマンドで作成した差分ファイルでアップデートされたコンテナイメージ「localhost/container1:1.0.1」が同時に存在する状態で、「podman rmi -f localhost/container1:1.0.0」コマンドを実行して古い方のコンテナイメージ(1.0.0の方)を削除した時、「-f」オプションにより新旧コンテナイメージで共通するコンテナイメージまで削除してしまうことはありますでしょうか?

ないです。コンテナのイメージは layers で管理されて、必要がなくなった layer だけが消されます。
(podman image rm の -f はただ "image is in use by a container" に対してそのコンテナを終了させてからの処理です)
具体的なイメージで説明した方がわかりやすいと思います:

========== 準備
armadillo:~# podman run --replace --name firstimage docker.io/alpine sh -c 'echo v1 > /v1'
93ef2e1693ea44c9803c12ddd170139c01b60b1f222b78de9bfaf56469a8c32e
armadillo:~# podman commit firstimage container1:1.0.0
Getting image source signatures
Copying blob 07d3c46c9599 skipped: already exists  
Copying blob 7ab115d59a93 done  
Copying config dd409da02c done  
Writing manifest to image destination
Storing signatures
dd409da02c88b2b0779ebd5e0c4e1619492e3a97268e4890d1c917ead265c195
armadillo:~# podman run --replace --name secondimage docker.io/alpine sh -c 'echo v2 > /v2'
armadillo:~# podman commit secondimage container1:1.0.1
Getting image source signatures
Copying blob 07d3c46c9599 skipped: already exists  
Copying blob 7f173dcd2c5d done  
Copying config 0197339707 done  
Writing manifest to image destination
Storing signatures
0197339707f8a47857eb4a86bd86c02b396dc0d446a4c6ba08368e53031c42c5
 
============== 現状
armadillo:~# podman image inspect docker.io/alpine localhost/container1:1.0.0 localhost/container1:1.0.1 | jq '.[] | ( .RepoTags, .RootFS )'
[
  "docker.io/library/alpine:latest"
]
{
  "Type": "layers",
  "Layers": [
    "sha256:07d3c46c9599a88fa81c385391300ab877b98ef71b18cce942455025657edeb5"
  ]
}
[
  "localhost/container1:1.0.0"
]
{
  "Type": "layers",
  "Layers": [
    "sha256:07d3c46c9599a88fa81c385391300ab877b98ef71b18cce942455025657edeb5",
    "sha256:7ab115d59a930a85a4f95e630dcac8c6d2b87691e79b25723bca831981ef0253"
  ]
}
[
  "localhost/container1:1.0.1"
]
{
  "Type": "layers",
  "Layers": [
    "sha256:07d3c46c9599a88fa81c385391300ab877b98ef71b18cce942455025657edeb5",
    "sha256:7f173dcd2c5dbbbfb4beac1220149ba89c59be0dc2d031429f633d8b2e23c27b"
  ]
}
 
^^^ これで、docker.io/alpine:image の layer を共有されてますので、
podman_partial_image で送った場合に07d3c46c9599..のlayerが
アーカイブに入れません
7ab115d59a930... は1.0.0だけに使われてます。
 
armadillo:~# podman image list
REPOSITORY                TAG         IMAGE ID      CREATED         SIZE
localhost/container1      1.0.1       0197339707f8  3 seconds ago   5.62 MB
localhost/container1      1.0.0       dd409da02c88  30 seconds ago  5.62 MB
docker.io/library/alpine  latest      8e1d7573f448  3 months ago    5.62 MB
 
==============不要なイメージを消す
armadillo:~# podman image rm -f docker.io/alpine
Untagged: docker.io/library/alpine:latest
armadillo:~# podman image rm -f localhost/container1:1.0.0
Untagged: localhost/container1:1.0.0
Deleted: dd409da02c88b2b0779ebd5e0c4e1619492e3a97268e4890d1c917ead265c195
armadillo:~# podman image inspect docker.io/alpine localhost/container1:1.0.0 localhost/container1:1.0.
1 | jq '.[] | ( .RepoTags, .RootFS )'
error inspecting object: localhost/container1:1.0.0: image not known
Error: error inspecting object: docker.io/alpine: image not known
[
  "localhost/container1:1.0.1"
]
{
  "Type": "layers",
  "Layers": [
    "sha256:07d3c46c9599a88fa81c385391300ab877b98ef71b18cce942455025657edeb5",
    "sha256:7f173dcd2c5dbbbfb4beac1220149ba89c59be0dc2d031429f633d8b2e23c27b"
  ]
}
 
^^^ 07d3... の部分は消されてません。

よろしくお願いします。