我尝试找到Docker镜像的一个特定标签.我怎么能在命令行上这样做?我尽量避免全部下载并删除不需要的图像.
在官方的Ubuntu版本中,https://registry.hub.docker.com/_/ubuntu/,有几个标签(发布它),而当我在命令行上搜索它时,
user@ubuntu:~$ docker search ubuntu | grep ^ubuntu ubuntu Official Ubuntu base image 354 ubuntu-upstart Upstart is an event-based replacement for ... 7 ubuntufan/ping 0 ubuntu-debootstrap 0
另外在命令行search
https://docs.docker.com/engine/reference/commandline/search/的帮助下,不知道它是如何工作的?
在docker search
命令中可以吗?
如果我使用原始命令通过Docker注册表API进行搜索,则可以获取信息:
$ curl https://registry.hub.docker.com//v1/repositories/ubuntu/tags | python -mjson.tool [ { "layer": "ef83896b", "name": "latest" }, ..... { "layer": "463ff6be", "name": "raring" }, { "layer": "195eb90b", "name": "saucy" }, { "layer": "ef83896b", "name": "trusty" } ]
shadowbq.. 35
使用CoreOS时jq
可以解析JSON数据.
就像你以前一样,看着 library/centos
$ curl -s -S 'https://registry.hub.docker.com/v2/repositories/library/centos/tags/' | jq '."results"[]["name"]' |sort "6" "6.7" "centos5" "centos5.11" "centos6" "centos6.6" "centos6.7" "centos7.0.1406" "centos7.1.1503" "latest"
更干净的v2 API现已上市,这就是我在示例中使用的内容.我将构建一个简单的脚本docker_remote_tags
:
#!/usr/bin/bash curl -s -S "https://registry.hub.docker.com/v2/repositories/library/$@/tags/" | jq '."results"[]["name"]' |sort
启用:
$ ./docker_remote_tags library/centos "6" "6.7" "centos5" "centos5.11" "centos6" "centos6.6" "centos6.7" "centos7.0.1406" "centos7.1.1503" "latest"
参考:
jq
:https://stedolan.github.io/jq/ |apt-get install jq
使用CoreOS时jq
可以解析JSON数据.
就像你以前一样,看着 library/centos
$ curl -s -S 'https://registry.hub.docker.com/v2/repositories/library/centos/tags/' | jq '."results"[]["name"]' |sort "6" "6.7" "centos5" "centos5.11" "centos6" "centos6.6" "centos6.7" "centos7.0.1406" "centos7.1.1503" "latest"
更干净的v2 API现已上市,这就是我在示例中使用的内容.我将构建一个简单的脚本docker_remote_tags
:
#!/usr/bin/bash curl -s -S "https://registry.hub.docker.com/v2/repositories/library/$@/tags/" | jq '."results"[]["name"]' |sort
启用:
$ ./docker_remote_tags library/centos "6" "6.7" "centos5" "centos5.11" "centos6" "centos6.6" "centos6.7" "centos7.0.1406" "centos7.1.1503" "latest"
参考:
jq
:https://stedolan.github.io/jq/ |apt-get install jq
我不喜欢上面的任何解决方案,因为A)他们需要我没有并且不想安装的外部库.B)我没有得到所有的页面.
Docker API将每个请求限制为100个项目.这将循环遍历每个"下一个"项目并获取它们全部(对于Python它的7页;其他可能或多或少...取决于)
如果您真的想要自己发送垃圾邮件,请| cut -d '-' -f 1
从最后一行删除,您将看到绝对的一切.
url=https://registry.hub.docker.com/v2/repositories/library/redis/tags/?page_size=100 `# Initial url` ; \
( \
while [ ! -z $url ]; do `# Keep looping until the variable url is empty` \
>&2 echo -n "." `# Every iteration of the loop prints out a single dot to show progress as it got through all the pages (this is inline dot)` ; \
content=$(curl -s $url | python -c 'import sys, json; data = json.load(sys.stdin); print(data.get("next", "") or ""); print("\n".join([x["name"] for x in data["results"]]))') `# Curl the URL and pipe the output to Python. Python will parse the JSON and print the very first line as the next URL (it will leave it blank if there are no more pages) then continue to loop over the results extracting only the name; all will be stored in a variable called content` ; \
url=$(echo "$content" | head -n 1) `# Let's get the first line of content which contains the next URL for the loop to continue` ; \
echo "$content" | tail -n +2 `# Print the content without the first line (yes +2 is counter intuitive)` ; \
done; \
>&2 echo `# Finally break the line of dots` ; \
) | cut -d '-' -f 1 | sort --version-sort | uniq;
样本输出:
$ url=https://registry.hub.docker.com/v2/repositories/library/redis/tags/?page_size=100 `#initial url` ; \ > ( \ > while [ ! -z $url ]; do `#Keep looping until the variable url is empty` \ > >&2 echo -n "." `#Every iteration of the loop prints out a single dot to show progress as it got through all the pages (this is inline dot)` ; \ > content=$(curl -s $url | python -c 'import sys, json; data = json.load(sys.stdin); print(data.get("next", "") or ""); print("\n".join([x["name"] for x in data["results"]]))') `# Curl the URL and pipe the JSON to Python. Python will parse the JSON and print the very first line as the next URL (it will leave it blank if there are no more pages) then continue to loop over the results extracting only the name; all will be store in a variable called content` ; \ > url=$(echo "$content" | head -n 1) `#Let's get the first line of content which contains the next URL for the loop to continue` ; \ > echo "$content" | tail -n +2 `#Print the content with out the first line (yes +2 is counter intuitive)` ; \ > done; \ > >&2 echo `#Finally break the line of dots` ; \ > ) | cut -d '-' -f 1 | sort --version-sort | uniq; ... 2 2.6 2.6.17 2.8 2.8.6 2.8.7 2.8.8 2.8.9 2.8.10 2.8.11 2.8.12 2.8.13 2.8.14 2.8.15 2.8.16 2.8.17 2.8.18 2.8.19 2.8.20 2.8.21 2.8.22 2.8.23 3 3.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.504 3.2 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 3.2.10 3.2.11 3.2.100 4 4.0 4.0.0 4.0.1 4.0.2 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 32bit alpine latest nanoserver windowsservercore
如果你想要bash_profile
版本:
function docker-tags () {
name=$1
# Initial URL
url=https://registry.hub.docker.com/v2/repositories/library/$name/tags/?page_size=100
(
# Keep looping until the variable URL is empty
while [ ! -z $url ]; do
# Every iteration of the loop prints out a single dot to show progress as it got through all the pages (this is inline dot)
>&2 echo -n "."
# Curl the URL and pipe the output to Python. Python will parse the JSON and print the very first line as the next URL (it will leave it blank if there are no more pages)
# then continue to loop over the results extracting only the name; all will be stored in a variable called content
content=$(curl -s $url | python -c 'import sys, json; data = json.load(sys.stdin); print(data.get("next", "") or ""); print("\n".join([x["name"] for x in data["results"]]))')
# Let's get the first line of content which contains the next URL for the loop to continue
url=$(echo "$content" | head -n 1)
# Print the content without the first line (yes +2 is counter intuitive)
echo "$content" | tail -n +2
done;
# Finally break the line of dots
>&2 echo
) | cut -d '-' -f 1 | sort --version-sort | uniq;
}
简单地称之为: docker-tags redis
样本输出:
$ docker-tags redis ... 2 2.6 2.6.17 2.8 --trunc---- 32bit alpine latest nanoserver windowsservercore
我编写了一个命令行工具来简化对Docker Hub存储库标签的搜索,该工具位于我的PyTools GitHub存储库中。与各种命令行开关一起使用很简单,但最基本的是:
./dockerhub_show_tags.py repo1 repo2
它甚至可以作为Docker映像使用,并且可以使用多个存储库:
docker run harisekhon/pytools dockerhub_show_tags.py centos ubuntu DockerHub repo: centos tags: 5.11 6.6 6.7 7.0.1406 7.1.1503 centos5.11 centos6.6 centos6.7 centos7.0.1406 centos7.1.1503 repo: ubuntu tags: latest 14.04 15.10 16.04 trusty trusty-20160503.1 wily wily-20160503 xenial xenial-20160503
如果要将其嵌入脚本中,请使用-q
/ --quiet
来获取标签,就像普通的Docker命令一样:
./dockerhub_show_tags.py centos -q 5.11 6.6 6.7 7.0.1406 7.1.1503 centos5.11 centos6.6 centos6.7 centos7.0.1406 centos7.1.1503
此脚本(docker-show-repo-tags.sh)适用于任何支持curl,sed,grep和sort的支持Docker的主机.这已更新,以反映存储库标记URL已更改的事实.
#!/bin/sh # # Simple script that will display Docker repository tags # using basic tools: curl, sed, grep, and sort. # # Usage: # $ docker-show-repo-tags.sh ubuntu centos for Repo in $* ; do curl -sS "https://hub.docker.com/r/library/$Repo/tags/" | \ sed -e $'s/"tags":/\\\n"tags":/g' -e $'s/\]/\\\n\]/g' | \ grep '^"tags"' | \ grep '"library"' | \ sed -e $'s/,/,\\\n/g' -e 's/,//g' -e 's/"//g' | \ grep -v 'library:' | \ sort -fu | \ sed -e "s/^/${Repo}:/" done
这个旧版本不再有效.
#!/bin/sh # WARNING: This no long works! # Simple script that will display Docker repository tags. # # Usage: # $ docker-show-repo-tags.sh ubuntu centos for Repo in $* ; do curl -s -S "https://registry.hub.docker.com/v2/repositories/library/$Repo/tags/" | \ sed -e $'s/,/,\\\n/g' -e $'s/\[/\\\[\n/g' | \ grep '"name"' | \ awk -F\" '{print $4;}' | \ sort -fu | \ sed -e "s/^/${Repo}:/" done
这是一个简单示例的输出:
$ docker-show-repo-tags.sh centos | cat -n 1 centos:5 2 centos:5.11 3 centos:6 4 centos:6.10 5 centos:6.6 6 centos:6.7 7 centos:6.8 8 centos:6.9 9 centos:7.0.1406 10 centos:7.1.1503 11 centos:7.2.1511 12 centos:7.3.1611 13 centos:7.4.1708 14 centos:7.5.1804 15 centos:centos5 16 centos:centos5.11 17 centos:centos6 18 centos:centos6.10 19 centos:centos6.6 20 centos:centos6.7 21 centos:centos6.8 22 centos:centos6.9 23 centos:centos7 24 centos:centos7.0.1406 25 centos:centos7.1.1503 26 centos:centos7.2.1511 27 centos:centos7.3.1611 28 centos:centos7.4.1708 29 centos:centos7.5.1804 30 centos:latest
据我所知,CLI不允许在存储库中搜索/列出标签.
但是如果你知道你想要哪个标签,你可以通过添加冒号和图像名称来明确地提取它: docker pull ubuntu:saucy