如何在 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 指令中使用变量的方法,例如使用ENV、ARG或在运行时传递它们。
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 命令中使用变量可以大大提高容器配置的灵活性和可维护性。通过使用ENV、ARG或运行时传递选项,您可以创建更动态和可配置的容器。此外,通过遵循最佳实践(例如对敏感信息使用环境变量并注意性能),您可以确保安全可靠的容器部署。