11

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

4

2 回答 2

7

您可以在 Dockerfile 中组合 ARG 和 ENV,正如我在“ ARG 或 ENV,在这种情况下使用哪一个? ”中提到的那样。

ARG FOO
ENV FOO=${FOO}

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

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

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

docker run -e FOO=$(...) ...
于 2018-06-19T05:48:36.610 回答
5

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

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

然后我们启动容器:

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

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

ENTRYPOINT 可以像这样工作:

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

或者像这样:

ENTRYPOINT foo --bar $baz

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

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

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

要了解如何正确覆盖入口点的正确语法,您必须查看它,这是肯定的,但通常这很奇怪 - 您必须在标签名称--entrypoint="foo" 之前--entrypoint放置标签名称,并将参数放在标签名称之后。奇怪的。

于 2018-06-19T19:06:44.747 回答