ブログ

podman イメージの差分を .tar ファイルに変換する方法

at_shiita.ishigaki
2022年6月22日 9時21分

.tar ファイルを使用して podman イメージを Armadillo-IoT G4 に入れる方法として、podman イメージをまるごと .tar ファイルにする方法と、podman イメージの差分のみを .tar ファイルにする方法が挙げられます。
podman イメージの差分のみを .tar ファイルにする方法のメリットとして、.tar ファイルの容量を小さくすることができます。デメリットとして、アップデートの元となる podman イメージが Armadillo-IoT G4 に入っている必要があります。
podman イメージの差分を .tar ファイルに変換するには podman_partial_image コマンドを使用します。 podman_partial_image コマンドの使い方を以下に示します。

[armadillo ~]# podman_partial_image -h
Usage: /usr/bin/podman_partial_image [-b base [-b base...]] [-o out.tar] archive [archive..]
base = image name recognizable by podman image inspect, to be removed from archive
archive = image name recognizable by podman save
 
By default intermediate copies are stored in /var/tmp,
set TMPDIR to change that directory

以下に podman_partial_image の使用例を示します。
使用例では、docker.io/alpine の podman イメージを使用して、パッケージのアップデートを行い、新しい podman イメージとして保存します。
次に podman_partial_image を使用して、docker.io/alpine の podman イメージと新しい podman イメージの差分を .tar ファイルに変換します。

まず、docker.io/alpine の podman イメージを pull します。

[armadillo ~]# podman pull docker.io/alpine
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
…
…
Writing manifest to image destination
Storing signatures
6e30ab57aeeef1ebca8ac5a6ea05b5dd39d54990be94e7be18bb969a02d10a3f

update という名前のコンテナを作成し、コンテナのパッケージをアップデートします。

[armadillo ~]# podman run --name update docker.io/alpine sh -c "apk update && apk upgrade && apk cache --purge"
fetch https://dl-cdn.alpinelinux.org/alpine/v3.16/main/aarch64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.16/community/aarch64/APKINDEX.tar.gz
v3.16.0-196-g143603d2cf [https://dl-cdn.alpinelinux.org/alpine/v3.16/main]
v3.16.0-198-g97d821185e [https://dl-cdn.alpinelinux.org/alpine/v3.16/community]
OK: 16881 distinct packages available
(1/4) Upgrading alpine-baselayout-data (3.2.0-r20 -> 3.2.0-r22)
(2/4) Upgrading busybox (1.35.0-r13 -> 1.35.0-r14)
Executing busybox-1.35.0-r14.post-upgrade
(3/4) Upgrading alpine-baselayout (3.2.0-r20 -> 3.2.0-r22)
Executing alpine-baselayout-3.2.0-r22.pre-upgrade
Executing alpine-baselayout-3.2.0-r22.post-upgrade
(4/4) Upgrading ssl_client (1.35.0-r13 -> 1.35.0-r14)
Executing busybox-1.35.0-r14.trigger
OK: 5 MiB in 14 packages

update コンテナを alpine:next として commit します。

[armadillo ~]# podman commit update alpine:next
Getting image source signatures
…
…
…
Writing manifest to image destination
Storing signatures
56d842b048b539ead9fd3f54ee7dfd43dff52b4ac43caed3219e9e53db0d1fcf

podman イメージが作成されていることを確認します。

[armadillo ~]# podman images
REPOSITORY                TAG         IMAGE ID      CREATED         SIZE
localhost/alpine          next        56d842b048b5  15 minutes ago  9.01 MB #commit されていることを確認
docker.io/library/alpine  latest      6e30ab57aeee  4 weeks ago     5.56 MB

podman イメージの差分を alpine_next.tar という名前で保存します。

[armadillo ~]# podman_partial_image -b docker.io/alpine -o alpine_next.tar alpine:next
[armadillo ~]# ls alpine_next.tar
alpine_next.tar