Docker中ENTRYPOINT指令与--entrypoint参数运行行为不一致问题
核心问题出在你Dockerfile里ENTRYPOINT的语法错误
Docker的ENTRYPOINT支持两种写法:exec数组格式、shell命令格式,其中exec数组格式强制要求使用双引号包裹数组元素,你写的ENTRYPOINT ['/src/script.sh']用了单引号,不符合语法规范,Docker无法将其识别为exec数组,会自动回退到shell格式处理,相当于实际执行的启动命令是/bin/sh -c "['/src/script.sh']",系统会把[/src/script.sh]整个当成一个可执行文件名去查找,自然会报文件不存在的错误。
而你执行docker run --entrypoint /src/script.sh created_image时,是直接将/src/script.sh作为独立的可执行路径传给容器启动逻辑,绕过了Dockerfile里错误定义的ENTRYPOINT解析逻辑,所以脚本可以正常运行。
修复方案
- 把ENTRYPOINT修改为符合规范的exec数组写法即可,调整后Dockerfile对应行改为:
重新构建镜像后直接ENTRYPOINT ["/src/script.sh"]docker run created_image就能正常启动。 - 如果你不需要处理容器停止的信号传递,也可以直接用shell格式写:
ENTRYPOINT /src/script.sh,也能正常运行,但更推荐标准的exec数组写法。
内容的提问来源于stack exchange,提问作者Farrell Fileas
相关产品推荐
相关产品推荐

