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
只启动应用程序堆栈的一部分。
我想在 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
只启动应用程序堆栈的一部分。