将ARG传递给ENTRYPOINT

13

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

3个回答

9

你可以在Dockerfile中同时使用ARG和ENV,就像我在"ARG或ENV,在这种情况下应该使用哪一个?"中提到的那样。

ARG FOO
ENV FOO=${FOO}

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

我猜参数也可以在运行docker时传递,而不是在docker构建阶段期间传递?

如果在运行时给FOO赋值更有意义,那么也可以使用docker run传递参数:

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

另一个解决方案可能是在docker run命令中使用--entrypoint并在那里传递标志?如果有效的话,可以将其添加到您的答案中。我不确定。 - Alexander Mills
@AlexanderMills 是的,但如果您的入口点仍然是“docker.r2g”,则可以覆盖CMD(因为CMD是传递给入口点的参数)。 - VonC
我不确定你是否已经看到了我的回答,但是为了让它正常工作,我尝试了很多方法。结果证明,在单个环境变量中包含参数列表并不那么稳健,因此使用bash中的 $@ 传递参数可能是最好的方式。 - Alexander Mills
谢谢,是的我明白了。我进行了最后一次更新,使用 docker run --entrypoint 我们可以覆盖 ENTRYPOINT,这可能是传递动态参数列表的绝佳方式。 - Alexander Mills

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环境变量?

然而,更加健壮的传递参数的方法是使用$@而不是环境变量。因此,你应该使用docker run命令覆盖--entrypoint,像这样:

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

要学习正确的语法如何正确地覆盖入口点,您需要查阅一下以确保,但通常情况下它很奇怪 - 您必须在标记名称之前放置--entrypoint="foo",并将参数--entrypoint放在标记名称之后。奇怪。

使用ENTRYPOINT的shell版本将在/bin/sh -c中执行命令,因此/bin/sh将成为PID 1,而不是foo。如果您需要将信号发送到foo,则可能会出现问题。我相信tini可以作为解决方法来解决这个问题。 - demisx

2
在我的情况下,我需要在构建时设置它,这意味着我无法控制docker run命令,因此我真的很苦恼,因为在Dockerfile中将其用作ARGENV指令无法正常工作。所以以下是我的解决方案,它非常有效:
ENTRYPOINT export $(grep -v '^#' .env | xargs -d '\n') \
    && your_command_passing_the_variable ${FOO}

基本上我所做的是将变量复制到文件中,然后在由ENTRYPOINT指令创建的同一Bash实例中导出值。该值被捕获并正确传递给命令。希望这可以帮助您。

注意:如果您需要在该文件中放置机密信息,请勿将该文件添加到版本控制系统(例如git)中,而是在管道期间创建该文件,并确保清除任何敏感信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接