前回の記事でDockerのイメージをsaveする方法を書きましたが、実際にバックアップする際はまとめてsaveしたかったりすると思います。

これを実現するには対象のイメージ一覧を一括で取得してきてシェルスクリプト辺りでまとめてsaveすればいいわけですね。というわけでやってみます。今回docker imagesコマンドでいろんなオプション使いますが下記が公式のドキュメントです。

docker images

対象のイメージの一覧を取得する


まずdocker imagesコマンドでイメージの一覧を取得してみます。こんな感じですね。

1
2
3
4
5
6
7
$docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 86b46bde2552 2 hours ago 1.2GB
jenkins 2.32.3 cc67e043e7fc 13 days ago 1.23GB
hello-world latest 1815c82652c0 2 weeks ago 1.84kB
cantino/huginn latest b5422bd595f9 6 weeks ago 889MB

まず、この中で<none>:<none>はいらない場合が多いと思います。ですので<none>:<none>を表示しないように--filterオプションに"dangling=false"を付けてイメージの一覧を表示してみます。ちなみに"dangling=true"にすると<none>:<none>もののみ 表示されます。

1
2
3
4
5
6
$docker images --filter "dangling=false"

REPOSITORY TAG IMAGE ID CREATED SIZE
jenkins 2.32.3 cc67e043e7fc 13 days ago 1.23GB
hello-world latest 1815c82652c0 2 weeks ago 1.84kB
cantino/huginn latest b5422bd595f9 6 weeks ago 889MB

この中でIMAGE ID(かもしくはREPOSITORY:TAG)があればsaveでイメージをtar形式で保存できるのでIMAGE IDのみ表示するようにしてみます。先ほどのコマンドに-qを付けて実行します。ちなみに、IMAGE IDでsaveするとload後にREPOSITORYとTAGがnoneになるようです

1
2
3
4
5
$docker images --filter "dangling=false" -q

cc67e043e7fc
1815c82652c0
b5422bd595f9

ただ、実際にsavetarにするときはREPOSITORYTAGの情報があった方がいいですね。ですので--formatオプションを使って表示する項目を指定します。この場合、前述の-qは不要になります。

1
2
3
4
5
$docker images --filter "dangling=false" --format "{{.Repository}}_{{.Tag}} {{.ID}}"

jenkins_2.32.3 cc67e043e7fc
hello-world_latest 1815c82652c0
cantino/huginn_latest b5422bd595f9

これで準備ができました。

シェルスクリプト書く


後は先ほどのコマンドをループでぶん回してsaveすればいいです。 初めはIMAGE IDを使用してsaveするように書いていたのですが、前述の通りload後にREPOSITORYとTAGがnoneになるようなので下記のスクリプトではREPOSITORY:TAGを指定してsaveするようにしています。今回はシェルスクリプトで書きました。

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
set -e

docker images --filter "dangling=false" --format "{{.Repository}}:{{.Tag}} {{.Repository}}_{{.Tag}}" | while read image
do
image_id=`echo $image | cut -d ' ' -f1`
image_name=`echo $image | cut -d ' ' -f2 | tr -d "/"`

docker save $image_id > ./${image_name}.tar
done

今回対象のイメージの中にはREPOSITORY/を含んでいるcantino/huginn_latestというのがあります。公式のイメージの場合はこういうのが結構あります。上記のスクリプトの場合だとスラッシュを消さないと(7行目のtr -d "/"でスラッシュを削除してます)9行目のsaveコマンドの際にパス区切りと判断されてディレクトリがないとエラーになります。下記のような感じ。

1
cannot create ./cantino/huginn_latest.tar: Directory nonexistent

実行結果

スクリプトを実行すると、各イメージが下記のようにtarで出来上がります。

1
2
3
cantinohuginn_latest.tar
hello-world_latest.tar
jenkins_2.32.3.tar

今回は書いてないですが、別途設定ファイル等を準備してループの中でgrepとか正規表現を使えば一致・除外などの条件に応じたイメージのみsaveすることもできます。