如何在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指令 – 你可以在Docker文件中使用 ENV 指令来设置一个环境变量,并在CMD指令中使用 $VARIABLE 语法引用它。例如 –
ENV VARIABLE=default
CMD echo “Printing the value of the VARIABLE : $VARIABLE”
你也可以在运行时使用 docker运行 命令中的 -e 标志传递环境变量—–。
docker run -e VARIABLE=new_value myimage
- 使用ARG指令 – 你可以在Docker文件中使用 ARG 指令,在构建时设置一个变量,并在CMD指令中使用 $VARIABLE 语法引用它。例如 –
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 标志传递一个变量,并在CMD指令中使用 $VARIABLE 语法引用它。
-
使用SHELL指令 – 你可以使用 SHELL 指令指定一个不同的shell进行命令扩展,并在CMD指令中使用shell的变量语法引用变量。例如 –
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}
- 在编译文件中使用 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 的情况下,文件应该包含键值对,每行一对,其中键是环境变量的名称,而值是应该分配给变量的值。
了解在Docker文件中使用变量的语法 CMD
Docker提供了几种在CMD指令中使用变量的方法,例如使用 ENV , ARG , 或在运行时传递变量。
ENV 指令设置了环境变量,可以在CMD指令中使用语法 $VARIABLE 来引用 。 例如,下面的Docker文件设置了一个环境变量 VARIABLE ,其值为 default ,并在CMD指令中引用它–
FROM alpine
ENV VARIABLE=default
CMD echo “Printing the value of the VARIABLE : $VARIABLE”
而在运行容器时,你可以在运行时使用 -e 标志传递变量的值 –
docker run -e VARIABLE=new_value myimage
ARG 指令用于在构建过程中定义变量,可以在CMD指令中使用语法 ${VARIABLE} 进行引用 。 例如,下面的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中使用变量的最佳做法
When using variables in a Dockerfile CMD, it’s important to keep in mind the following best practices −
- 将环境变量用于敏感信息,如密码和令牌,并确保不在镜像中包含它们。
-
要注意性能,尽量减少CMD指令中使用的环境变量的数量。
-
使用变量的方式要便于将来对容器配置进行更新和修改。
结论
总之,在Dockerfile CMD中使用变量可以大大改善容器配置的灵活性和可维护性。通过使用 ENV 、 ARG 或在运行时传递选项,你可以创建更加动态和可配置的容器。此外,通过遵循最佳实践,如对敏感信息使用环境变量和注意性能,你可以确保安全和可靠的容器部署。