将 ARG 传递给 ENTRYPOINT

Pass ARG to ENTRYPOINT

假设我在 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 阶段传递?

您可以在您的 Dockerfile 中组合 ARG 和 ENV,正如我在“

中提到的
ARG FOO
ENV FOO=${FOO}

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

I guess the argument could also be passed with docker run instead of during the docker build phase?

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

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

这个简单的技巧对我有用:

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

不确定为什么后者不是首选 - 但环境变量 interpolation/interpretation 只能使用后者。参见:

但是,更可靠的传递参数的方法 是使用 $@ 而不是环境变量。所以你应该做的是使用 docker run 命令覆盖 --entrypoint,像这样:

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

要了解如何正确覆盖入口点的正确语法,你必须查一下,当然,但总的来说它很奇怪 - 你必须在 --entrypoint="foo" 标签名称,以及 --entrypoint 的参数, 标签名称之后。奇怪。