You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:20:26