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

Dockerfile中如何将ARG作为CMD参数传递?

问题原因

你使用了数组格式的CMD指令(CMD ["sh", "/bin/docker-entrypoint.sh", "${USERNAME}"]),这种exec模式下Docker不会调用shell解析环境变量,会把${USERNAME}作为字面量字符串直接传递给脚本,导致脚本拿到的不是实际的用户名。

解决方案

有两种常用的修复方式:

方式一:改用shell格式CMD,让shell解析变量

把CMD改成非数组的shell格式,Docker会启动一个shell来处理变量替换:

CMD sh /bin/docker-entrypoint.sh "${USERNAME}"

如果需要保留数组格式(比如要指定特定shell参数),可以用sh -c包裹命令:

CMD ["sh", "-c", "sh /bin/docker-entrypoint.sh \"${USERNAME}\""]

方式二:让脚本直接读取环境变量(更简洁)

既然容器里已经定义了USERNAME环境变量,完全不需要通过参数传递,直接修改entrypoint.sh:

#!/usr/bin/env sh
# 直接读取环境变量,无需接收参数
chown -hR "$USERNAME":"$USERNAME" /export

然后把CMD简化为:

CMD ["/bin/docker-entrypoint.sh"]

这种方式更直接,避免了参数传递的问题。

额外小问题

你的docker build命令里有个语法错误:-t mycontainer:$VERSION}多了一个多余的右大括号,正确写法是:

docker build \
       --build-arg USERNAME=$(whoami) \
       -t mycontainer:$VERSION \
       -f ./docker/Dockerfile .

内容的提问来源于stack exchange,提问作者Apollo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:30:21