【问题标题】:Docker ARG in CMD command with process带有进程的 CMD 命令中的 Docker ARG
【发布时间】:2021-08-09 09:26:36
【问题描述】:

我想在 cmd 命令中的 Dockerfile 上插入一个变量,但在 docker run 上的 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 run id 上,我得到了:

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

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

docker build --build-arg ARG1=conf1

【问题讨论】:

标签: docker cmd arguments supervisord


【解决方案1】:

如果您需要覆盖最终正在运行的命令,您可以在运行容器时直接指定;您不需要重建映像来运行不同的命令或使用不同的输入文件。

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

不过,按照您编写 Dockerfile 的方式,映像中永远不会有多个配置文件。当你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 之类的命令来仅启动应用程序堆栈的一部分。

【讨论】:

    【解决方案2】:

    Dockerfile 中的ARG 仅在构建阶段可用。

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

    如果您想使用构建参数 (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 id 上,但是我给出了一个错误 Error: could not find config file /etc/supervisor/supervisord_${ENV1}.conf
    • 你的 docker build 命令是什么?应该是docker build --build-arg VAR1=conf1 <IMAGE_NAME> .
    • 我的命令是 docker build --build-arg VAR1=conf1 -f toto/Dockerfile 。在 docker run id_contenair 之后
    • 你可以试试,docker build --build-arg VAR1=conf1 -f toto/Dockerfile -t supervisor:latest . 用于构建,docker run supervisor:latest 用于运行构建的图像。这是为了确保您运行的是您构建的正确映像。
    • 还是同样的问题
    猜你喜欢
    • 2015-10-12
    • 2016-06-04
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多