已知
-
CMD
是docker
镜像被运行起来之后执行的命令,一般用来启动我们的应用 -
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
看看输出了什么
太多了,截图没有截全
不过没关系,大致原理是可以看出来的
这个 Cmd
是在 Config
这个map
里的
try 1
我有一个大胆的想法 docker inspect -f {{.Config.ArgsEscaped}} 12757ca59e37
预测是输出 true
果然
try 2
我们再次大胆的试试 docker inspect -f {{.Config.Healthcheck}} 12757ca59e37
预测是输出
{
"Test": [
"NONE"
]
}
但是
不符合预期,官网搜了搜,嗯,加个
json
就可以指定输出为json
格式注意:命令多了两个单引号哦,不加会报错
try 3
经过上面两次尝试,可以发现{{}}
里面的语法类似 jsonpath
(实际上是 go 模板
,不过我不care...)
如果含有.
会如何呢?
首先看下labels
我们尝试取一下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