将 ARG 传递给 ENTRYPOINT

Ale*_*lls 8 docker dockerfile docker-build docker-entrypoint docker-run

假设我在 Dockerfile 中有这个:

ARG FOO=1
ENTRYPOINT ["docker.r2g", "run"]
Run Code Online (Sandbox Code Playgroud)

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

docker build -t "$tag" --build-arg FOO="$(date +%s)" .
Run Code Online (Sandbox Code Playgroud)

有没有办法做这样的事情:

ENTRYPOINT ["docker.r2g", "run", ARG FOO]  // something like this
Run Code Online (Sandbox Code Playgroud)

我想这个论点也可以通过 withdocker run而不是在docker build阶段期间传递?

Von*_*onC 7

你可以在你的 Dockerfile 中结合 ARG 和 ENV,正如我在“ ARG 或 ENV,在这种情况下使用哪一个?

ARG FOO
ENV FOO=${FOO}
Run Code Online (Sandbox Code Playgroud)

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

我想这个论点也可以通过 docker run 而不是在 docker build 阶段传递?

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

docker run -e FOO=$(...) ...
Run Code Online (Sandbox Code Playgroud)


Ale*_*lls 5

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

FROM node:9
# ...
ENTRYPOINT dkr2g run "$dkr2g_run_args"
Run Code Online (Sandbox Code Playgroud)

然后我们启动容器:

docker run \
    -e dkr2g_run_args="$run_args" \
    --name "$container_name" "$tag_name"
Run Code Online (Sandbox Code Playgroud)

将环境变量传播到命令行参数中可能会出现一些边缘情况问题,但在大多数情况下应该可以工作。

ENTRYPOINT 可以像这样工作:

ENTRYPOINT ["foo", "--bar", "$baz"]  # $baz will not be interpreted
Run Code Online (Sandbox Code Playgroud)

或者像这样:

ENTRYPOINT foo --bar $baz
Run Code Online (Sandbox Code Playgroud)

不知道为什么后者不是首选 - 但环境变量插值/解释只能使用后者。请参阅:如何在 ENTRYPOINT 数组中使用 Docker 环境变量?

然而,传递参数的更可靠的方法是使用$@环境变量来代替。所以你应该做的是使用docker run命令覆盖 --entrypoint,如下所示:

docker run --entrypoint="foo" <tag> --bar $@
Run Code Online (Sandbox Code Playgroud)

要了解如何正确覆盖入口点的正确语法,您必须查找它,当然,但总的来说,这很奇怪 - 您必须将 , 的参数放在标签名称--entrypoint="foo" 之前--entrypoint,并将,的参数放在标签名称之后。诡异的。