Chapter 07

おまけ: ARM イメージがあるかがさっと調べる

ほげさん
ほげさん
2021.12.05に更新

Docker Hub のここをいちいち見に来るのめんどくさいな

image

というわけで、前に作ったツールを供養しておきます

コマンドで取得できればいいじゃん

docker manifest inspect でできるぞ

$ DOCKER_CLI_EXPERIMENTAL=enabled

$ docker manifest inspect alpine:latest --verbose
[
	{
		"Ref": "docker.io/library/alpine:latest@sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3",
		"Descriptor": {
			"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
			"digest": "sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3",
			"size": 528,
			"platform": {
				"architecture": "amd64",
				"os": "linux"
			}
		},
		"SchemaV2Manifest": {
			"schemaVersion": 2,
			"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
			"config": {
				"mediaType": "application/vnd.docker.container.image.v1+json",
				"size": 1471,
				"digest": "sha256:c059bfaa849c4d8e4aecaeb3a10c2d9b3d85f5165c66ad3a4d937758128c4d18"
			},
			"layers": [
				{
					"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
					"size": 2818413,
					"digest": "sha256:59bf1c3509f33515622619af21ed55bbe26d24913cedbca106468a5fb37a50c3"
				}
			]
		}
	},
	{
		"Ref": "docker.io/library/alpine:latest@sha256:e047bc2af17934d38c5a7fa9f46d443f1de3a7675546402592ef805cfa929f9d",
		"Descriptor": {
			"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
			"digest": "sha256:e047bc2af17934d38c5a7fa9f46d443f1de3a7675546402592ef805cfa929f9d",
			"size": 528,
			"platform": {
				"architecture": "arm",
				"os": "linux",
				"variant": "v6"
			}
		},
		"SchemaV2Manifest": {
			"schemaVersion": 2,
			"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
			"config": {
				"mediaType": "application/vnd.docker.container.image.v1+json",
				"size": 1484,
				"digest": "sha256:14f3026d927f00e733daa66d4dd23ef30f93f64d47b43df08ef45e33e67d2d4a"
			},
			"layers": [
				{
					"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
					"size": 2631421,
					"digest": "sha256:e4a43de54da9e309482f6762f0c11f5f547cd8fd61a49c5f158453066162023e"
				}
			]
		}
	},
	{
        # 略
	}
]

ただこいつ、出力パターンが結果によって微妙に違うので jq に食わせづらいんだよ

スクリプトにすればいいじゃん

適当に Ruby にでもするぞ

parse-docker-manifest.rb
require 'json'

platform = ->(json) { ['os', 'architecture', 'variant'].map { |k| json['Descriptor']['platform'][k] }.compact.join('/') }
show = ->(x) { puts "- #{x}" }

image = ARGV[0]

puts "\n#{image}"

json = JSON.load(`DOCKER_CLI_EXPERIMENTAL=enabled; docker manifest inspect #{image} --verbose`)

(json.instance_of?(Array) ? json : [json])
  .map(&platform)
  .sort
  .each(&show)
$ ruby parse-docker-manifest.rb alpine:latest

alpine:latest
- linux/386
- linux/amd64
- linux/arm/v6
- linux/arm/v7
- linux/arm64/v8
- linux/ppc64le
- linux/s390x

いんでね

けど一発が結構重いので叩いてちょっと待って叩いてちょっと待ってはだるいんだよ

イメージ名をかき集めればいいじゃん

先にイメージ名のリストを作って一気に全投げすればいいぞ

Dockerfile から

適当にがっさがっさと

$ grep -i 'from ' -r -h --include '*[D|d]ockerfile*' . | awk '{ print $2 }'
php:8.0-fpm-buster
node:16-alpine
nginx:1.20-alpine
mysql/mysql-server:8.0
jboss/keycloak:latest

docker-compose.yml から

同じく適当に

細かい都合は調整するよろし

$ grep 'image:' docker-compose.yml | grep -v '#' | awk '{ print $2 }'
mailhog/mailhog:latest

プロセス置換する

こんなやつのこと

$ cat <(pwd) <(date +"%Y-%m-%d")
/tmp
2021-08-15

探すコマンドを作ったらプロセス置換で全部くっつける

$ cat <(grep -i 'from ' -r -h --include '*[D|d]ockerfile*' . | awk '{ print $2 }') <(grep 'image:' docker-compose.yml | grep -v '#' | awk '{ print $2 }') | sort -u
jboss/keycloak:latest
mailhog/mailhog:latest
mysql/mysql-server:8.0
nginx:1.20-alpine
node:16-alpine
php:8.0-fpm-buster

片っ端から Ruby に放り込む

$ cat <(grep -i 'from ' -r -h --include '*[D|d]ockerfile*' . | awk '{ print $2 }') <(grep 'image:' docker-compose.yml | grep -v '#' | awk '{ print $2 }') | sort -u | xargs -Iimage ruby parse-docker-manifest.rb image

jboss/keycloak:latest
- linux/amd64

mailhog/mailhog:latest
- linux/amd64

mysql/mysql-server:8.0
- linux/amd64
- linux/arm64/v8

nginx:1.20-alpine
- linux/386
- linux/amd64
- linux/arm/v6
- linux/arm/v7
- linux/arm64/v8
- linux/ppc64le
- linux/s390x

node:16-alpine
- linux/amd64
- linux/arm/v6
- linux/arm/v7
- linux/arm64/v8
- linux/ppc64le
- linux/s390x

php:8.0-fpm-buster
- linux/386
- linux/amd64
- linux/arm/v5
- linux/arm/v7
- linux/arm64/v8
- linux/mips64le
- linux/ppc64le
- linux/s390x

あとは覚悟すればいいじゃん

自分のプロジェクトでこれをぶったたいて、linux/arm64/v8 がどれくらい足りないか把握する

あとはがんばる