如何以root运行ENTRYPOINT并通过gosu切换至非root用户执行CMD?
问题分析与解决
核心问题
你的ENTRYPOINT写法导致CMD的参数没有正确传递给startup-ssh.sh中的$@,最终gosu因为缺少要执行的命令而报错。
当使用ENTRYPOINT ["/bin/bash", "-c", "/app/startup-ssh.sh"]时,Docker会将CMD的内容作为bash -c的后续参数,但bash -c的特性是:只有第一个参数会被当作执行的命令,后续参数会被赋值给$0、$1等变量,而不是传递给脚本的$@。这就导致startup-ssh.sh里的exec gosu wagtail "$@"没有接收到要执行的startup-main.sh命令,gosu因缺少必要参数抛出用法错误。
解决方案
有两种修正方式:
方式1:直接将脚本作为ENTRYPOINT(推荐)
修改Dockerfile中的ENTRYPOINT定义,去掉bash -c,让脚本直接作为ENTRYPOINT,这样CMD的参数会被正确传递给脚本的$@:
ENTRYPOINT ["/app/startup-ssh.sh"] CMD ["/bin/bash", "-c", "/app/startup-main.sh"]
方式2:调整bash -c的参数传递格式
如果必须保留bash -c,需要调整写法,确保CMD的参数能传递到脚本的$@:
ENTRYPOINT ["/bin/bash", "-c", "/app/startup-ssh.sh \"$@\"", "--"] CMD ["/bin/bash", "-c", "/app/startup-main.sh"]
这里的--是为了标记参数的开始,确保后续所有CMD参数都被传递给脚本。
额外验证点
- 确认
startup-main.sh的权限和路径正确,避免切换用户后无法执行
内容的提问来源于stack exchange,提问作者lexeme
相关产品推荐
相关产品推荐

