docker - 当没有提供ENTRYPOINT且在Exec Form中使用CMD而没有可执行文件时,在Docker中执行什么?

标签 docker cmd

引用Docker documentation for CMD:

The CMD instruction has three forms:

CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

These defaults can include an executable, or they can omit the executable, in which case you must specify an ENTRYPOINT instruction as well.



再次引用Docker文档,这次是Understand how CMD and ENTRYPOINT interact:

The table below shows what command is executed for different ENTRYPOINT / CMD combinations:


                            No ENTRYPOINT
CMD [“p1_cmd”, “p2_cmd”]    p1_cmd p2_cmd

我不明白我在上面复制的路口。我希望CMD [“p1_cmd”, “p2_cmd”]No ENTRYPOINT的交集是error, not allowed(就像No CMD,No ENTRYPOINT一样),但是表中说p1_cmd p2_cmd被执行了。我假设p1_cmdp2_cmd是参数,类似于-t -a或其他参数。

那么在这种状态下执行什么呢?这是否意味着参数变为可执行文件?

最佳答案

想象这的最简单方法是ENTRYPOINTCMD都定义了单词列表,而最终命令是通过将两个列表串联在一起来构造的。 Docker无法知道CMD列表的第一个单词是否实际上是可执行文件。

启动容器时,所有这三个命令都运行完全相同的命令:

FROM busybox
ENTRYPOINT ["/bin/ls"]
CMD ["-lrt", "/"]

FROM busybox
ENTRYPOINT []
CMD ["/bin/ls", "-lrt", "/"]

FROM busybox
ENTRYPOINT ["/bin/ls", "-lrt", "/"]
CMD []

我的一般经验是,CMD本身应始终是格式正确的命令。这样做有两个很好的理由:docker run --rm -it imagename sh经常可以用来查看镜像构建过程中的结果;还有一种有用的模式,将ENTRYPOINT设置为执行一些首次设置的脚本,然后设置exec "$@"来运行CMD。 (将两者结合起来,在第一次安装运行后,您将获得一个调试shell。)

# good
CMD ["/app/myapp", "--foreground"]

# good
ENTRYPOINT ["wait-for-it.sh", "db:5432", "--"]
CMD ["/app/myapp", "--foreground"]

# hard to provide an alternate command or an ENTRYPOINT wrapper
ENTRYPOINT ["/app/myapp"]
CMD ["--foreground"]

出于实际目的,ENTRYPOINT必须为JSON数组形式,并且不得使用sh -c包装器。如文档所述,如果ENTRYPOINT是一个简单的命令,则CMD会被忽略;如果它具有显式的sh -c包装器,则与其他参数的交互作用并不明显。

# just prints an empty line
FROM busybox
ENTRYPOINT /bin/echo
CMD ["one", "two", "three", "four"]

# just prints an empty line
FROM busybox
ENTRYPOINT ["/bin/sh", "-c", "/bin/echo"]
CMD ["one", "two", "three", "four"]

实际上,ENTRYPOINT作为裸露的字符串本身并不会阻止CMD。但是生成的/bin/sh -c 'some command' arg arg以不明显的方式在命令中设置$0$1等。

# prints "three"
FROM busybox
ENTRYPOINT echo $2
CMD ["one", "two", "three", "four"]

# prints "-c"
FROM busybox
ENTRYPOINT echo $1
CMD one two three four

关于docker - 当没有提供ENTRYPOINT且在Exec Form中使用CMD而没有可执行文件时,在Docker中执行什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58107845/

相关文章:

windows - 使用正则表达式批量移动文件到新文件夹

mysql - Windows 上 heroku 登录的奇怪响应(关于 MySQL)(关闭)

docker - 带Traefik和让我们加密的矩阵(突触)家庭服务器

process - 主机上的容器进程

security - 是否可以限制 docker 守护进程仅构建镜像(而不运行容器)?

docker - 从图像流中部署 OpenShift Origin 中的特定图像标签

docker - 如何为Kafka本地开发配置docker-compose.yml?

php - 从 PHP 启动程序

android - Openssl 结果在 Windows 的 cmd 和 power shell 中不匹配

batch-file - for 循环后的条件 (Batch/CMD)