ブログ

Armadillo Base OS:コンテナの保存と読み込み方法について

at_shinya.matsumoto
2022年3月4日 9時31分

本ブログはpodmanのコンテナをアーカイブとして保存するimport、saveコマンド、保存されたアーカイブを読み込む
export、loadコマンドについて説明します。

コンテナの保存方法

コンテナは下記2つのコマンドどちらでもtarアーカイブとして保存する事が出来ます。
Armadillo-IoT G4はOS領域にファイル保存する事を推奨しておりませんので、USBメモリに直接保存する例として、
以下に例を示します。
注意点として、SWUpdateに使用するアーカイブファイルはsaveコマンドで作成したものをご使用下さい

保存するコンテナ名:container_test
保存するイメージ名:container_test:v1.0
保存するファイル名:container_test_v1.0.tar
※/mntにusbメモリをマウント

コンテナから直接アーカイブとして保存する場合(<b>※SWUpdateには使えません</b>)
# podman export -o /mnt/container_test_v1.0.tar container_test
 
コンテナイメージを作成してからアーカイブとして保存する場合
# podman commit container_test container_test:v1.0
# podman save -o /mnt/container_test_v1.0.tar container_test:v1.0

《注意》
 上記の主な違いはexportコマンドはコンテナから直接アーカイブとして保存できますが、commit⇒saveコマンドは
 コンテナイメージとして保存した後にアーカイブとして保存します。もう一つ大きな違いとして前者はレイヤー構造
 の情報が破棄
されます(動作に違いは無し)。レイヤー情報については最後に説明します。

コンテナイメージの読み込み方法

コンテナイメージを読み込む方法は2種類あり、上記で説明したexportで保存した場合とsaveで保存した場合で
コマンドが異なります。以下に例を示します。

読み込むファイル名:container_test_v1.0.tar
読み込んだイメージ名:container_test:v1.0
※/mntにusbメモリをマウント

exportコマンドで保存したイメージを読み込む場合
# podman import /mnt/container_test_v1.0.tar container_test:v1.0
 
saveコマンドで保存したイメージを読み込む場合(元の名前とタグを維持)
# podman load -i /mnt/container_test_v1.0.tar

上記コマンドでどちらもイメージとして読み込む事が出来ます。

コンテナイメージのレイヤー情報について

ここでexportとsaveの違いとして挙げましたレイヤー構造の情報について説明します。
podman inspectコマンドでコンテナイメージのレイヤー情報を見る事が出来ますので比較してみます。

比較用に同じコンテナからexportしたcontainer_test:exportとcommit⇒saveしたconteiner_test:saveを
準備しました。(exportを行った場合、少しサイズが小さくなります)

# podman images
REPOSITORY                 TAG         IMAGE ID      CREATED             SIZE        R/O
localhost/container_test   export      af4145fcc0ab  48 seconds ago      35.2 MB     false
localhost/container_test   save        525280fc7bb0  About a minute ago  35.3 MB     false

最初に、container_test:saveのレイヤー情報をinspectコマンドで表示します。

container_test:saveのレイヤー情報(抜粋)
# podman inspect container_test:save
[
    {
        "Id": "525280fc7bb0d87a4c0ff9d56bb808b392496804900ca4e42af50c20f62ed6ab",
        "Digest": "sha256:e2e8dd9b12c90a70dbdbf12c7578b36734fa0e90c57e1ae8cd108c5a25f07e5e",
        "RepoTags": [
            "localhost/container_test:save"
        ],
        "RepoDigests": [
            "localhost/container_test@sha256:e2e8dd9b12c90a70dbdbf12c7578b36734fa0e90c57e1ae8cd108c5a25f07e5e"
(中略)
        "History": [
            {
                "created": "2021-11-24T20:39:20.356035534Z",
                "created_by": "/bin/sh -c #(nop) ADD file:df53811312284306901fdaaff0a357a4bf40d631e662fe9ce6d342442e494b6c in / "
            },
            {
                "created": "2021-11-24T20:39:20.472395573Z",
                "created_by": "/bin/sh -c #(nop)  CMD [\"/bin/sh\"]",
                "empty_layer": true
            },
            {
                "created": "2022-03-04T04:08:14.901964569Z",
                "created_by": "/bin/sh",
                "comment": "FROM docker.io/library/alpine:latest"
            }
        ],
        "NamesHistory": [
            "localhost/container_test:save"
        ]
    }
]

container:latest:saveはHistoryからコンテナイメージ”alpine:latest”を元に作った事が分かります。
commit(save)してアーカイブファイルを作っていくことで、今後このイメージに手を加えた時に
レイヤー情報がHistoryに追加されていきます。

次にcontainer_test:exportのレイヤー情報を表示します。

container_test:exportのレイヤー情報(抜粋)
# podman inspect container_test:export
    {
        "Id": "af4145fcc0ab798f7d7ee450a095718465d81f7138e99124bc800509483ed6eb",
        "Digest": "sha256:8826ec893fb3c69d4302b7a69436e3979be7ef7733b11728044f585cf40d9515",
        "RepoTags": [
            "localhost/container_test:export"
        ],
        "RepoDigests": [
            "localhost/container_test@sha256:8826ec893fb3c69d4302b7a69436e3979be7ef7733b11728044f585cf40d9515"
(中略)
        "History": [
            {
                "created": "2022-03-04T13:09:15.450291373+09:00",
                "created_by": "/bin/sh -c #(nop) ADD file:90db7e4d6834c6fe3432fbf43829cd9cbc034e5aa00ccfbee228629659049994 in /",
                "comment": "imported from tarball"
            }
        ],
        "NamesHistory": [
            "localhost/container_test:export"
        ]
    }
]

container:latest:exportはイメージ元の情報が残っていません。
そのレイヤー情報が不要という場合はexportコマンドでも問題ありません。