docker-compose中ENTRYPOINT执行后运行多条CMD命令异常问题咨询
问题原因解释
核心原因:exec模式下无shell解析语法符
当你使用数组格式定义entrypoint和command时,Docker默认使用exec模式执行,不会自动启动shell处理命令中的特殊语法:
- 数组中的每个元素都会被直接作为程序的入参传递,不会做任何语法解析。你写的
[ "echo" ,"toto","&&","echo","tutu" ]会被当成「给echo命令传递4个参数:toto、&&、echo、tutu」,所以echo会把所有参数拼接打印,输出toto && echo tutu。 - 你提到的文档中
exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd的逻辑,仅适用于字符串格式的CMD/ENTRYPOINT(也就是shell模式)。如果command直接写字符串而不是数组,Docker才会自动给命令包一层/bin/sh -c "你的命令字符串",交给shell处理&&、管道、变量替换这类shell专属语法。
结合脚本逻辑验证
你的entrypoint.sh中最后执行的是exec "$@",这个语句的作用是把传给entrypoint脚本的所有参数原封不动传递给exec启动的进程:
- 数组格式的command传递过来的参数没有经过shell处理,直接就交给了echo执行,自然不会识别
&&的命令拼接逻辑。 - 你改成
"bash -c 'echo toto && echo tutu'"之后,属于shell模式的command,Docker会主动启动shell处理整个命令字符串,&&被正确识别为命令连接符,所以会依次执行两个echo,输出符合预期。
可选的规范写法
如果希望保持数组格式的command写法,同时支持多命令拼接,可以主动声明调用shell:
command: [ "bash", "-c", "echo toto && echo tutu" ]
效果和字符串写法完全一致。
内容的提问来源于stack exchange,提问作者raphaelauv
相关产品推荐
相关产品推荐

