美文网首页
显示 docker 镜像 image 的 cmd

显示 docker 镜像 image 的 cmd

作者: Yellowtail | 来源:发表于2018-09-14 10:36 被阅读0次

    已知

    • CMDdocker 镜像被运行起来之后执行的命令,一般用来启动我们的应用
    • Dockerfile 中可以写多个CMD,但是只有最后一个生效
    • 并且docker run的时候可以通过传参数覆盖这个命令

    question

    how to show cmd of docker image?
    那么我们在生成完docker image 之后,如何去显示 这个CMD呢?(如果有的话)

    solution

    docker inspect -f '{{.Config.Cmd}}' <image:tag>

    比如

    [root]# docker inspect -f '{{.Config.Cmd}}' 2bb8384ba254
    [dumb-init java -jar sms-web-1.0.jar --spring.profiles.active=dev]
    

    扩展

    这个命令是怎么来的呢?
    我们可以执行一下docker inspect 2bb8384ba254
    看看输出了什么

    输出.png
    太多了,截图没有截全

    不过没关系,大致原理是可以看出来的
    这个 Cmd 是在 Config 这个map里的

    try 1

    我有一个大胆的想法 docker inspect -f {{.Config.ArgsEscaped}} 12757ca59e37
    预测是输出 true
    果然

    image.png

    try 2

    我们再次大胆的试试 docker inspect -f {{.Config.Healthcheck}} 12757ca59e37
    预测是输出

    {
        "Test": [
            "NONE"
        ]
    }
    

    但是

    image.png
    不符合预期,官网搜了搜,嗯,加个json 就可以指定输出为json格式
    注意:命令多了两个单引号哦,不加会报错
    image.png

    try 3

    经过上面两次尝试,可以发现{{}}里面的语法类似 jsonpath
    (实际上是 go 模板,不过我不care...)
    如果含有.会如何呢?
    首先看下labels

    image.png

    我们尝试取一下io.kubernetes.container.name

    [root@iZwz95w0dtnuuhgb2np2dmZ ~]# docker inspect -f {{.Config.Labels.io.kubernetes.container.name}} 12757ca59e37
    <no value>
    

    竟然没有取到,去谷歌搜搜,发现了一个用法,在这里

    [root@iZwz95w0dtnuuhgb2np2dmZ ~]# docker inspect -f '{{index .Config.Labels "io.kubernetes.container.name"}}' 12757ca59e37
    ms-sms
    

    注意,

    • {{}}被两个单引号包裹
    • 增加了index
    • Labels和后面的key之间有空格

    参考

    https://stackoverflow.com/questions/30441035/how-to-find-the-cmd-command-of-a-docker-image
    https://docs.docker.com/engine/reference/commandline/inspect/#get-an-instances-image-name
    https://stackoverflow.com/a/33884893

    相关文章

      网友评论

          本文标题:显示 docker 镜像 image 的 cmd

          本文链接:https://www.haomeiwen.com/subject/oanngftx.html