Dockerfile中ENTRYPOINT搭配CMD执行脚本及命令时异常问题问询
两种写法不生效的底层原因
第一种写法失败原因
exec 数组形式的 ENTRYPOINT/CMD 不会启动 shell 进程解析命令语法,所有数组元素都会被当作第一个启动程序的普通参数传递。
你给出的第一种配置实际执行逻辑等价于:
./mybashscript ";" "flask"
其中的 ; 不会被识别为 shell 命令分隔符,仅作为普通字符串参数传入 mybashscript,等脚本执行完成后容器直接退出,不会触发 flask 命令运行。
第二种写法参数被忽略的原因
bash -c 的固定执行规则为:-c 后的第一个字符串是要执行的命令脚本,后续所有额外参数只会按顺序赋值给命令脚本内的 $0、$1、$2... 等位置变量,不会自动拼接在 -c 指定的命令末尾。
你给出的第二种配置最终等价于执行:
/bin/bash -c "./mybashscript && flask" run
这里的 run 被赋值给了命令脚本内的 $0,但你写的命令脚本中没有引用任何位置参数,因此参数会被完全忽略,flask 命令收不到 run 指令自然无法正常启动服务。
符合需求的正确写法
如果要保留 CMD 传参的能力,只需在 -c 的命令字符串内通过 $@ 引用后续传入的参数即可,注意需要多传一个占位符占住 $0 的位置,避免第一个 CMD 参数被当作 $0 吃掉:
ENTRYPOINT [ "/bin/bash", "-c", "./mybashscript && flask \"$@\"", "dummy_placeholder" ] CMD [ "run" ]
这种写法下最终执行的命令就是你预期的 ./mybashscript && flask run,也可以在启动容器时传入其他参数覆盖默认的 run 指令。
内容的提问来源于stack exchange,提问作者renatodamas
相关产品推荐
相关产品推荐

