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
相关产品推荐
相关产品推荐

