如何找到Docker镜像的CMD命令?

58

我安装了一个Docker镜像,想要检查它的CMD命令。是否有CLI命令可以实现这一点? 举例来说,我希望它告诉我这个Docker镜像的CMD是["rails","server"]。

3个回答

76
您可以使用 docker inspect 命令。
docker inspect --format='{{.Config.Cmd}}' <image:tag>
docker inspect -f '{{.Config.Cmd}}' <image:tag>

例如,它可用于“在Docker中列出运行/停止的容器的完整命令”,如此处所述。


正如user2915097Lenormju评论中指出的那样,另一种方法是使用docker history --no-trunc

docker history --no-trunc zenithar/nano-nginx | awk ' NR==2 {print}'

1
虽然使用docker inspect是最好的方式,因为一个docker镜像在它的最后一层有这个命令,但是一个小技巧是使用类似于“docker history zenithar/nano-nginx | awk ' NR==2 {print}'”这样的东西,但是这种方法的缺点是命令被截断了。 - user2915097
1
@user2915097,Dockerfile必须以CMD结尾吗? - VonC
不,它可以是CMD、ENTRYPOINT或什么都没有。 我们回到了docker inspect。 - user2915097
现在docker history命令有一个--no-trunc选项。@user2915097 - Lenormju
1
@Lenormju 谢谢您的反馈。我已经在答案中包含了这个替代方案,并加上了 --no-trunc 以增加可见性。 - VonC
显示剩余2条评论

4
如果正在运行,您可以使用以下命令:docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q)。从this response无耻地拉取。

2
我认为docker inspect -f '{{.Config.Cmd}}' <image:tag>方法是不正确的,因为这个命令返回的值可能是错误的。例如:
$ docker inspect -f '{{.Config.Cmd}}' nginx:1.25.1-alpine
[nginx -g daemon off;]

这里搞砸的是,在实际的入口点中,daemon off;是一个单个参数。这个信息在docker inspect命令的输出中丢失了。
更好的命令应该是:
$ docker history --no-trunc nginx:1.25.1-alpine | grep -m 1 -Po "(?<=CMD \[).+(?=\])"
"nginx" "-g" "daemon off;"

这样可以让我们正确地重建使用的命令。入口点也是如此。
所以,我认为提取CMD/ENTRYPOINT信息的更好/可靠的方法是:
docker history --no-trunc <image:tag> | grep -m 1 -Po "(?<=CMD \[).+(?=\])"
docker history --no-trunc <image:tag> | grep -m 1 -Po "(?<=ENTRYPOINT \[).+(?=\])"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接