如何在Docker命令行上的Docker注册表中找到具有特定标记的Docker镜像?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Docker命令行上的Docker注册表中找到具有特定标记的Docker镜像?相关的知识,希望对你有一定的参考价值。

我尝试找到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 registry 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"
    }
]
答案

据我所知,CLI不允许在存储库中搜索/列出标签。

但是如果你知道你想要哪个标签,你可以通过添加冒号和图像名称来明确地提取它:docker pull ubuntu:saucy

另一答案

您可以使用Visual Studio Code为可用的泊坞窗图像和标签提供自动完成功能。但是,这需要您键入标记的第一个字母才能看到自动填充建议。

例如,当写FROM ubuntu时,它提供自动填充建议,如ubuntuubuntu-debootstrapubuntu-upstart。在写FROM ubuntu:a时,它提供了像ubuntu:artfulubuntu:artful-20170511.1这样的自动完成建议

另一答案

使用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"

参考:

jqhttps://stedolan.github.io/jq/ | apt-get install jq

另一答案

此脚本(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":/\
"tags":/g' -e $'s/]/\
]/g' | 
        grep '^"tags"' | 
        grep '"library"' | 
        sed -e $'s/,/,\
/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/,/,\
/g' -e $'s/[/\[
/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
另一答案

我不喜欢上面的任何解决方案,因为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("
".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("
".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("
".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
    &

以上是关于如何在Docker命令行上的Docker注册表中找到具有特定标记的Docker镜像?的主要内容,如果未能解决你的问题,请参考以下文章

Docker,MySQL - 在 .sh 文件中找不到命令

Docker - 在 docker 容器日志中找不到模块

如何获取 docker 注册表 v2 上的图像列表

在容器中找不到 Docker“/usr/bin/php”

lsb_release:在最新的 Ubuntu Docker 容器中找不到命令

在 Docker 中找不到 MySQL 的 mysql_config [重复]