代码之家  ›  专栏  ›  技术社区  ›  Chris F

为什么“docker image ls”命令不能使用CUT命令?

  •  3
  • Chris F  · 技术社区  · 6 年前

    我想得到一个特定图像的Docker图像ID

    $ docker image ls
    
    REPOSITORY                                                          TAG                 IMAGE ID            CREATED             SIZE
    123456789012.dkr.ecr.us-east-1.amazonaws.com/some-name1             60                  4a625fb9a2a4        5 hours ago         3.97GB
    987654321012.dkr.ecr.us-east-1.amazonaws.com/some-other-name2       365                 59b27e46effc        6 days ago          3.98GB
    

    我想这会给我一个图像ID,在这个例子中是4A625FB9A2A4…

    $ docker image ls | grep name1 | cut -d " " -f3
    

    ……但它没有,它给了一个空白。我错过了什么?

    这需要一个简单的shell脚本,所以我可以将它嵌入到jenkinsfile管道中的groovy脚本中。

    4 回复  |  直到 6 年前
        1
  •  4
  •   Arount    5 年前

    因为每个数据之间有多个。

    更简单的方法是将空白分割为一个空格并剪切:

    docker image ls | grep name1 | tr -s ' ' | cut -d " " -f 3
    

    编辑: chepner's answer is to prefere , 但我让这个活了下来,因为最初的问题是“为什么” .

        2
  •  5
  •   chepner    6 年前

    最好的办法是 docker images ls 做所有的工作,而不是解析它的默认输出。

    $ docker image ls --filter "reference=*name1*" -q
    4a625fb9a2a4
    

    --filter 替换您的 grep 命令,和 -q 取代 cut . 还有一个 --format 更精确地控制输出的选项,但是 -Q 实际上只是一条捷径 --format '{{.ID}}' .

    不管出于什么原因, --过滤器 不做你需要的,你可以一直用 --格式 生成更容易被其他命令解析的输出。

        3
  •  2
  •   larsks    6 年前

    我想是的 awk 更适合拆分列输出。例如:

    $ docker image ls | awk '/fedora/ {print $3}'
    cc510acfcd70
    5292e27c6dac
    422dc563ca32
    

    或者,您可以使用 --format 更好地合作 cut :

    $ docker image ls --format '{{ .Repository }} {{ .ID }}' | grep fedora | cut -d" " -f2
    cc510acfcd70
    5292e27c6dac
    422dc563ca32
    
        4
  •  0
  •   aicastell    6 年前

    您可以使用“sed”命令转换“docker image ls”的输出,用一个未使用的字符替换一组空格,稍后可以使用“cut”命令来获取您感兴趣的字段。例如:

    $ docker image ls | sed "s/  */#/g" | cut -f 3 -d "#"
    

    在上面的示例中,您用“”字符替换一组空格,然后使用“cut”命令打印用-f编号的预期字段。