如何在 Dockerfile 的 CMD 命令中使用变量?


简介

在 Dockerfile 的 CMD 命令中使用变量可以大大提高容器配置的灵活性和可维护性。在 CMD 指令中硬编码值会使将来难以更新或修改容器的配置。使用变量允许更动态和可重用的配置。

前提条件

在 Dockerfile 的 CMD 命令中使用变量的前提条件取决于您选择使用的方法:

  • 使用 shell 展开 - 无需任何特定前提条件。

  • 使用 ENV 指令 - 无需任何特定前提条件。

  • 使用 ARG 指令 - 无需任何特定前提条件。

  • 运行时传递变量 - 无需任何特定前提条件,但您应该有一个正在运行的 Docker 守护进程并安装了 Docker 命令行工具。

  • 使用 SHELL 指令 - 您应该在系统上安装一个与 SHELL 指令中使用的语法兼容的 shell。

  • 在镜像构建期间使用 --build-arg 标志 - 您应该在系统上安装 Docker。

  • 在 compose 文件中使用运行时变量并在docker-compose up 命令期间将其传递给容器 - 您应该在系统上安装 Docker 和 Docker-compose。

  • 在 compose 文件中使用ENV_FILE指令从文件传递环境变量到容器 - 您应该在系统上安装 Docker 和 Docker-compose,以及包含环境变量的键值对文件。

同样重要的是要注意,在所有情况下,变量都应该在其在 CMD 指令中使用之前定义,无论是通过 ENV 或 ARG 指令、shell 展开还是运行时标志。

在 Dockerfile CMD 中使用变量的方法

  • 使用 shell 展开 - 您可以通过使用 shell 展开在 CMD 指令中包含变量。语法是$VARIABLE${VARIABLE}。例如:

ENV VARIABLE=default 
CMD echo “Printing the value of the VARIABLE : $VARIABLE” 
  • 使用 ENV 指令 - 您可以在 Dockerfile 中使用ENV指令设置环境变量,并使用$VARIABLE语法在 CMD 指令中引用它。例如:

ENV VARIABLE=default 
CMD echo “Printing the value of the VARIABLE : $VARIABLE” 

您还可以使用docker run命令中的-e标志在运行时传递环境变量:

docker run -e VARIABLE=new_value myimage 
  • 使用 ARG 指令 - 您可以在 Dockerfile 中使用ARG指令在构建时设置变量,并使用$VARIABLE语法在 CMD 指令中引用它。例如:

ARG VARIABLE=default 
CMD echo “Printing the value of the VARIABLE : $VARIABLE” 

您可以使用--build-arg标志在构建期间传递变量值:

docker build --build-arg VARIABLE=new_value -t myimage . 
  • 运行时传递变量 - 您可以使用docker run命令中的-e标志在运行时传递变量,并使用$VARIABLE语法在 CMD 指令中引用它。

  • 使用 SHELL 指令 - 您可以使用SHELL指令为命令展开指定不同的 shell,并使用 shell 的变量语法在 CMD 指令中引用变量。例如:

SHELL ["bash", "-c"]
ENV VARIABLE=default
CMD echo “Printing the value of the VARIABLE : $VARIABLE”
  • 在镜像构建期间使用--build-arg标志

docker build --build-arg VARIABLE=new_value -t myimage . 
  • 在 compose 文件中使用运行时变量,并在docker-compose up命令期间将其传递给容器。

version: "3.8"
services:
  web:
    build: .
    environment:
      - VARIABLE=${VARIABLE}
  • 在 compose 文件中使用ENV_FILE指令从文件传递环境变量到容器。

  • version: "3.8"
    services:
      web:
        build: .
        env_file:
          - .env
    

    以及在.env文件中:

    VARIABLE=new_value 
    

    在以上所有示例中,您可以使用$VARIABLE语法在 CMD 指令中引用变量。

    CMD echo “Printing the value of the VARIABLE : $VARIABLE” 
    

    重要的是要注意,在ENV_FILE的情况下,文件应该包含键值对,每行一对,其中键是环境变量的名称,值是要分配给变量的值。

    理解在 Dockerfile CMD 中使用变量的语法

    Docker 提供了几种在 CMD 指令中使用变量的方法,例如使用ENVARG或在运行时传递它们。

    ENV指令设置环境变量,可以使用$VARIABLE语法在 CMD 指令中引用。例如,以下 Dockerfile 设置一个值为default的环境变量VARIABLE,并在 CMD 指令中引用它:

    FROM alpine 
    ENV VARIABLE=default 
    CMD echo “Printing the value of the VARIABLE : $VARIABLE” 
    

    在运行容器时,您可以使用-e标志在运行时传递变量的值:

    docker run -e VARIABLE=new_value myimage 
    

    ARG指令用于在构建过程中定义变量,可以使用${VARIABLE}语法在 CMD 指令中引用。例如,以下 Dockerfile 设置一个值为default的 ARG VARIABLE,并在 CMD 指令中引用它:

    FROM alpine 
    ARG VARIABLE=default 
    CMD echo "The value of VARIABLE is: ${VARIABLE}" 
    

    在构建镜像时,您可以使用--build-arg标志传递变量的值:

    docker build --build-arg VARIABLE=new_value -t myimage .
    

    也可以使用 docker run 命令在运行时传递变量,例如:

    docker run --env VARIABLE=new_value myimage 
    

    在 Dockerfile CMD 中使用变量的最佳实践

    在 Dockerfile 的 CMD 命令中使用变量时,务必记住以下最佳实践:

    • 对敏感信息(如密码和令牌)使用环境变量,并确保不要将它们包含在镜像中。

    • 注意性能,并尽量减少 CMD 指令中使用的环境变量的数量。

    • 以允许将来轻松更新和修改容器配置的方式使用变量。

    结论

    总之,在 Dockerfile 的 CMD 命令中使用变量可以大大提高容器配置的灵活性和可维护性。通过使用ENVARG或运行时传递选项,您可以创建更动态和可配置的容器。此外,通过遵循最佳实践(例如对敏感信息使用环境变量并注意性能),您可以确保安全可靠的容器部署。

    更新于:2023年2月17日

    9K+ 次浏览

    开启你的职业生涯

    完成课程获得认证

    开始学习
    广告