为何Dockerfile中ENTRYPOINT搭配CMD时CMD未执行?
Docker容器运行后CMD未输出的原因及解决方法
问题场景
你的Dockerfile内容如下:
FROM centos:7 ENTRYPOINT /bin/echo CMD "helloworld"
构建该镜像后执行docker run -it --name=con1 centos,却看不到"helloworld"的输出。
原因分析
核心问题出在ENTRYPOINT的格式和它与CMD的协作逻辑上:
- 当ENTRYPOINT使用
ENTRYPOINT /bin/echo这种shell格式时,Docker会自动用/bin/sh -c包裹这个命令,此时ENTRYPOINT会启动一个独立的shell进程,这个模式下CMD的内容会被完全忽略——shell格式的ENTRYPOINT不会接收任何来自CMD的参数。 - 另外你写的
CMD "helloworld"带引号的写法,即使ENTRYPOINT能接收参数,也会把带引号的字符串当作一个整体参数,但这里因为shell格式的ENTRYPOINT根本不读取CMD,所以这部分内容完全没机会被执行。
修复方案
有两种简单的修复方式:
方式1:改用exec格式的ENTRYPOINT
这是Docker推荐的方式,exec格式的ENTRYPOINT会把CMD的内容作为参数传递进去:
FROM centos:7 ENTRYPOINT ["/bin/echo"] CMD ["helloworld"]
方式2:直接在shell格式的ENTRYPOINT中包含输出内容
如果一定要用shell格式的ENTRYPOINT,可以把要输出的内容直接写在ENTRYPOINT里:
FROM centos:7 ENTRYPOINT /bin/echo helloworld
验证
用修复后的Dockerfile重新构建镜像,再执行docker run -it --name=con1 centos,就能正常看到"helloworld"的输出了。
内容的提问来源于stack exchange,提问作者meallhour
相关产品推荐
相关产品推荐

