Docker CMD 命令中的 ARG 进程

Docker ARG in CMD command with process

我想在 Dockerfile 中的 cmd 命令中插入一个变量,但是在 docker 运行 上的 CMD 命令中无法识别该变量,如上

ARG VAR1
ENV VAR1=$VAR1

COPY files/etc/supervisor/supervisord_"$VAR1".conf /etc/supervisor/supervisord_"$VAR1".conf
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord_${VAR1}.conf"]

在 docker 运行 上,我有 :

错误:找不到配置文件 /etc/supervisor/supervisord_${ENV1}.conf

在 Dockerfile 上没有 ARG,我的 suprevisord 工作得很好

docker build --build-arg ARG1=conf1

ARG in Dockerfile 仅在构建阶段可用。

当您想 运行 将其作为容器时,ARG 值将不可用,但 ENV 可用。这意味着您不能直接访问 CMD 中的那些值(在 ENTRYPOINT 中也不可用)。您可以阅读 了解更多信息。

如果您想使用构建参数 (ARG) 将环境参数传递给容器,简单的解决方案是执行如下操作:

ARG ARG1
ENV ENV1=$ARG1

然后更新你的CMD

CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord_${ENV1}.conf"]

请记住,您的 COPY 指令仍应使用 ARG,因为它用于构建阶段。所以你的 Dockerfile 将是:

ARG ARG1
ENV ENV1=$ARG1

COPY files/etc/supervisor/supervisord_"$ARG1".conf /etc/supervisor/supervisord_"$ARG1".conf
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord_${ENV1}.conf"]

然后您可以使用常用的 docker run ... 命令来 运行 此图像。


您也可以像下面这样进一步简化:

ARG VAR1
ENV VAR1=$VAR1

COPY files/etc/supervisor/supervisord_"$VAR1".conf /etc/supervisor/supervisord_"$VAR1".conf
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord_${VAR1}.conf"]

然后使用以下构建命令构建 Dockerfile:

docker build --build-arg VAR1=conf1

如果您需要覆盖最终成为 运行 的命令,您可以在 运行 容器时直接指定;您不需要将图像重建为 运行 不同的命令或具有不同的输入文件。

docker run your-image \
  supervisord -c /etc/supervisor/supervisord_foo.conf

不过,按照您编写 Docker 文件的方式,映像中的配置文件永远不会超过一个。当你COPY它进来的时候,你可以使用一个固定的名字。

ARG ARG1
# Copy the file to its default location; then you don't need a -c option
COPY files/etc/supervisor/supervisord_"$ARG1".conf /etc/supervisor/supervisord.conf
CMD ["/usr/bin/supervisord"]

许多工具和配置框架支持将大部分或全部选项作为环境变量传递,在您自己的应用程序中,您也应该考虑这种模式。直接设置环境变量(使用 docker run -e 选项)往往比覆盖命令容易得多。

最后:这个整体设置看起来像是您在尝试 运行 容器中的多个进程,然后将容器配置为 运行 这些进程的不同子集。通常的最佳做法是 运行 一个容器中只有一个进程,并避免像 supervisord 这样的进程管理器。您可能会考虑像 Docker Compose 这样可以同时启动多个容器的工具是否适合您的应用程序;您可以 运行 命令如 docker-compose up -d backend 只启动应用程序堆栈的一部分。