将ARG传递给ENTRYPOINT

时间:2018-06-19 04:53:34

标签: docker dockerfile docker-build docker-entrypoint docker-run

说我在Dockerfile中有这个:

ARG FOO=1
ENTRYPOINT ["docker.r2g", "run"]

我用以下内容构建上述内容:

docker build -t "$tag" --build-arg FOO="$(date +%s)" .

有没有办法做类似的事情:

ENTRYPOINT ["docker.r2g", "run", ARG FOO]  // something like this

我猜这个论点也可以用docker run而不是docker build阶段传递?

2 个答案:

答案 0 :(得分:2)

你可以在你的Dockerfile中结合ARG和ENV,就像我在“ARG or ENV, which one to use in this case?”中提到的那样

ARG FOO
ENV FOO=${FOO}

这样,您docker.r2g就可以访问${FOO}环境变量。

  

我猜这个参数也可以用docker run而不是docker build阶段传递?

如果在运行时给FOO一个值更有意义,那也是可能的:

docker run -e FOO=$(...) ...

答案 1 :(得分:1)

这种简单的方法对我有用:

FROM node:9
# ...
ENTRYPOINT dkr2g run "$dkr2g_run_args"

然后我们使用以下命令启动容器:

docker run \
    -e dkr2g_run_args="$run_args" \
    --name "$container_name" "$tag_name"

将env变量散布到命令行参数中可能会遇到一些极端情况,但是在大多数情况下应该起作用。

ENTRYPOINT可以像这样工作:

ENTRYPOINT ["foo", "--bar", "$baz"]  # $baz will not be interpreted

或者像这样:

ENTRYPOINT foo --bar $baz

不确定为什么不首选后者-但是只能使用后者进行env变量插值/解释。参见:How do I use Docker environment variable in ENTRYPOINT array?

但是,传递参数的一种更可靠的方法是使用$@而不是env变量。因此,您应该做的是使用docker run命令覆盖--entrypoint,如下所示:

docker run --entrypoint="foo" <tag> --bar $@

要了解有关如何正确覆盖入口点的正确语法,请确保一定要查找一下,但是总的来说这很奇怪-您必须将--entrypoint="foo" 放在之前标签名称,以及--entrypoint的参数,标签名称的之后。很奇怪。

相关问题