有没有办法让Docker列出所有可以下载的可用镜像版本?
假设我想获取最新版本的 Apache,那么我可以输入以下内容:
docker pull httpd:latest
现在,如果我对特定版本感兴趣,我可以输入以下内容:
docker pull httpd:2.4.34
为了能够做到这一点,我需要知道有一个版本
2.4.34
可用。现在,有没有办法列出可用版本?我正在寻找类似的东西:
docker list httpd versions
我希望得到类似的回复:
2.4.34
2.4.32
2.4.29
2.2.34
...
此操作有一个 API 端点,解释如下:
https://docs.docker.com/registry/spec/api/#listing-image-tags
端点本身如下:
/v1/repositories/(namespace)/(repository)/tags
因此您可以运行以下命令来访问它:
curl -u <username>:<password> https://registry-1.docker.io/v1/repositories/<username>/<image_name>/tags
我不知道docker是否支持这个,但是
podman
有--list-tags
:
podman search nginx --list-tags
显示(截断):
NAME TAG
docker.io/library/nginx 1
docker.io/library/nginx 1-alpine
docker.io/library/nginx 1-alpine-perl
docker.io/library/nginx 1-perl
docker.io/library/nginx 1.10
...
docker.io/library/nginx 1.11.12
docker.io/library/nginx 1.11.12-alpine
docker.io/library/nginx 1.11.13
当结果很多时,
--limit
参数可以和--list-tags
一起派上用场。 podman search --list-tags --limit 1000 docker.io/library/mariadb
显示 365 个结果...
使用skopeo
brew install skopeo
skopeo list-tags docker://docker.io/redis
skopeo list-tags docker://container-registry.oracle.com/database/free
这将返回一个 JSON 对象,显示所有可用的图像版本
这是使用 OCI 标签列表 API 完成的。在 Docker Hub 上调用该脚本的 shell 脚本如下所示:
token=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repo}:pull" \
-u "${username}:${password}" \
| jq -r '.token')
curl -H "Authorization: Bearer $token" \
-s "https://registry-1.docker.io/v2/${repo}/tags/list" | jq .
但是,我建议使用为此设计的各种工具之一,这将有助于身份验证(或匿名访问)和分页(当标签数量超过注册表限制时)。以下是我所知道的一些工具:
来自 Google 的起重机:
$ crane ls busybox
1
1-glibc
1-musl
1-ubuntu
1-uclibc
1.21-ubuntu
1.21.0-ubuntu
1.23
1.23.2
1.24
1.24-glibc
1.24-musl
1.24-uclibc
...
来自微软的ORAS:
$ oras repo tags docker.io/library/busybox
1
1-glibc
1-musl
1-ubuntu
1-uclibc
1.21-ubuntu
1.21.0-ubuntu
1.23
1.23.2
1.24
1.24-glibc
1.24-musl
1.24-uclibc
...
来自 RedHat 的 Skopeo:
$ skopeo list-tags docker://docker.io/library/busybox
{
"Repository": "docker.io/library/busybox",
"Tags": [
"1",
"1-glibc",
"1-musl",
"1-ubuntu",
"1-uclibc",
"1.21-ubuntu",
"1.21.0-ubuntu",
"1.23",
"1.23.2",
"1.24",
"1.24-glibc",
"1.24-musl",
"1.24-uclibc",
...
我自己的regctl:
$ regctl tag ls busybox
1
1-glibc
1-musl
1-ubuntu
1-uclibc
1.21-ubuntu
1.21.0-ubuntu
1.23
1.23.2
1.24
1.24-glibc
1.24-musl
1.24-uclibc
...