我正在尝试使用ENTRYPOINT
和CMD
,以使ENTRYPOINT
是我正在调用的脚本,而CMD
为ENTRYPOINT
提供了默认参数。命令,但将被赋予docker run
的任何参数所覆盖。
我苦苦挣扎的部分是如何使用CMD
在默认参数中扩展环境变量。
例如。鉴于此dockerfile内置为标签test
:
FROM busybox
ENV AVAR=hello
ENTRYPOINT ["/bin/sh", "-c", "exec echo \"$@\""]
CMD ["${AVAR}"]
我期望得到以下结果:
docker run -it --rm test
> hello
docker run -it --rm test world
> world
注意:这里我仅以echo
为例。在我实际的Dockerfile中,我将调用./bin/somescript.sh
,这是一个启动我无法控制的应用程序的脚本,也是我试图将参数传递给的脚本。
This question与之类似,但是询问有关在ENTRYPOINT
中扩展变量的问题,我正在尝试在CMD
中扩展变量。
我已经为ENTRYPOINT
和CMD
尝试了shell/exec形式的许多组合,但是我似乎找不到魔术组合:
FROM busybox
ENV AVAR=hello
ENTRYPOINT ["/bin/sh", "-c", "exec echo \"$@\""]
CMD ${AVAR}
docker run -it --rm test
> -c ${AVAR}
我想做的是可能的吗?
这是我能得到的最接近的
FROM busybox
ENV AVAR=hello
ENV AVAR2=world
ENTRYPOINT ["/bin/sh", "-c", "echo $@", "$@"]
CMD ["${AVAR}", "${AVAR2}"]
当我将参数传递给运行命令时,此方法工作正常:
docker run -it --rm test world
> world
但是当没有给出命令时,它不会扩展默认参数:
docker run -it --rm test
> ${AVAR} ${AVAR2}
答案 0 :(得分:0)
发现了魔力。我不完全了解这里发生的事情,但我会尽力解释
FROM busybox
ENV AVAR=hello
ENV AVAR2=world
ENTRYPOINT ["/bin/sh", "-c", "echo $(eval echo $@)", "$@"]
CMD ["${AVAR}", "${AVAR2}"]
docker run -it --rm test
> hello world
docker run -it --rm test world
> world
我试图解释(我不确定这是否正确):
exec格式的 CMD
作为参数传递给ENTRYPOINT
而不用shell替换。我正在获取这些值,并将它们作为位置参数传递给/bin/sh -c ...
,这就是为什么我需要在ENTRYPOINT
数组的末尾添加“额外”“ $ @”。
在ENTRYPOINT
内,我需要扩展$@
并根据扩展结果进行参数替换。因此,在子外壳($(...)
)中,我调用eval
进行参数替换,然后回显结果,最终结果只是CMD
的内容,但变量被替换。
如果我将参数传递给docker run
,则它仅代替CMD
并得到正确的评估。