引用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_cmd
和p2_cmd
是参数,类似于-t
-a
或其他参数。那么在这种状态下执行什么呢?这是否意味着参数变为可执行文件?
最佳答案
想象这的最简单方法是ENTRYPOINT
和CMD
都定义了单词列表,而最终命令是通过将两个列表串联在一起来构造的。 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/