Dockerfile CMD指令中的条件设置标志

Dockerfile CMD指令中的条件设置标志,docker,dockerfile,Docker,Dockerfile,在dockerfile的末尾,我有一个CMD说明: CMD ['my_script.sh', '--debug'] 但是我希望debug标志是可选的,在构建时选择。我的解决方案是使用构建参数,即 ARG DEBUG="" CMD ["my_script.sh", "$DEBUG"] 然后用任何一个 docker image build --build-arg='--debug' ...etc 或 使用第一个选项,映像将成功构建,但在运行容器时,会出现以下错误: Invalid option

在dockerfile的末尾,我有一个
CMD
说明:

CMD ['my_script.sh', '--debug']
但是我希望
debug
标志是可选的,在构建时选择。我的解决方案是使用构建参数,即

ARG DEBUG=""
CMD ["my_script.sh", "$DEBUG"]
然后用任何一个

docker image build --build-arg='--debug' ...etc

使用第一个选项,映像将成功构建,但在运行容器时,会出现以下错误:

Invalid option '$DEBUG'
双引号必须导致命令实际使用字符串
$DEBUG
。但是更改内容以使
$DEBUG
包含在单引号中或不包含引号

/bin/sh: [my_script.sh,: No such file or directory
最后,使用

CMD ./my_script.sh $DEBUG
成功运行容器,但忽略
$DEBUG


我做错什么了吗?有更好的解决办法吗?有什么解决办法吗?

问题是,
$DEBUG
只在构建时知道。因此,如果您希望在容器运行时解析它,可以从调试
ARG
中设置
ENV
变量作为解决方法:

ARG DEBUG=""
ENV DEBUG ${DEBUG}
CMD ["sh", "-c", "my_script.sh $DEBUG"]
这样,您将有一个名为
DEBUG
的环境变量,该变量的值来自
ARG DEBUG
,并且可以从cmd访问该环境变量

然而,我认为您可以只使用环境变量-不需要构建arg。然后可以使用
-e
选项将环境变量值传递给容器。例如,空
DEBUG
env变量:

docker container run -e DEBUG image_name
或有价值的:

docker container run -e DEBUG=--debug image_name

当然还有更好的方法,将
my_script.sh
作为入口点,而不是CMD。然后,在运行映像时,您只需将您的env作为运行参数传递:
docker run your/image$DEBUG
这很接近,但我必须将
CMD
更改为
CMD[“sh”,“-c”,“my_script.sh$DEBUG”]
。你能在回答中注意到这一点吗?
docker container run -e DEBUG=--debug image_name