如何通过变量扩展将默认CMD传递给ENTRYPOINT?

时间:2018-10-24 17:05:09

标签: docker

我正在尝试使用ENTRYPOINTCMD,以使ENTRYPOINT是我正在调用的脚本,而CMDENTRYPOINT提供了默认参数。命令,但将被赋予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中扩展变量。

我已经为ENTRYPOINTCMD尝试了shell/exec形式的许多组合,但是我似乎找不到魔术组合:

FROM busybox

ENV AVAR=hello
ENTRYPOINT ["/bin/sh", "-c", "exec echo \"$@\""]
CMD ${AVAR}

docker run -it --rm test
> -c ${AVAR}

我想做的是可能的吗?

Many more failed attempts


这是我能得到的最接近的

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}

1 个答案:

答案 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并得到正确的评估。