Dockerfile CMD指令中的条件设置标志
在dockerfile的末尾,我有一个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
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