更多 Docker 的使用技巧可以查看 Docker 专栏:Docker

1. Docker为容器设置环境变量的应用场景

Docker 为容器设置环境变量是一种常见的做法,在多种应用场景中发挥着重要作用,以下是一些典型的应用场景:

1.1 配置应用程序

环境变量可以用来传递配置信息给应用程序,比如数据库连接字符串、API密钥、服务端口等。这使得同一镜像可以在不同的环境中(开发、测试、生产)使用不同的配置,而无需改变代码或镜像本身

1.2 保护敏感信息

敏感数据如密码和认证令牌可以通过环境变量传入容器,而不是硬编码到应用代码或包含在镜像中。这对于提升安全性非常重要,因为镜像可能会被共享或公开

1.3 动态调整行为

通过设置环境变量,可以控制应用程序的行为模式。例如,开启或关闭某些功能特性,或者选择不同的日志级别

1.4 简化部署过程

在持续集成/持续部署(CI/CD)流程中,环境变量可以帮助自动化部署过程。不同阶段的部署(如开发、预发布、生产)可以使用相同的镜像,仅通过更改环境变量来适应不同的环境需求

1.5 跨平台一致性

使用环境变量有助于确保容器化应用在任何主机上运行时都能获得一致的配置,无论是在云服务器、本地机器还是开发者笔记本电脑上

2. 准备工作

  • Alpine Linux 是一款轻量级、以安全为导向的 Linux 发行版,基于 musl libc 和 BusyBox
  • Alpine Linux 于 2010 年前后创立,并迅速因其小巧、高效和安全性而受到欢迎
  • Alpine Linux 特别适合用于路由器、防火墙、VPN、VoIP 盒子以及服务器操作系统,并且经常作为 Docker 容器镜像的基础操作系统

我们下载 alpine 镜像,用于验证为容器设置环境变量之后是否生效

sudo docker pull alpine:3.21.3
  • 环境变量是操作系统级别的配置,在系统启动时设置,可以被系统中的所有进程访问
  • 环境变量命名通常是全部使用大写字母,使用下划线 _ 来分隔单词
  • 本文出现的小写字母加下划线分隔单词的环境变量命名方法是不规范的,之所以没有修改,是因为太费时间

3. 在docker run命令中设置容器的环境变量

3.1 使用–env或-e标志

在使用 docker run 命令启动容器时,可以使用 --env-e 标志来设置环境变量

sudo docker run -d \
    --name alpine_01 \
    --env "env01=value01" \
    alpine:3.21.3

查看容器内的环境变量

sudo docker inspect alpine_01 | jq '.[].Config.Env'

如果没有安装 jq 工具,可以使用以下指令查看容器的环境变量

sudo docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' alpine_01

可以发现,我们设置的环境变量生效了

在这里插入图片描述


如果要设置多个环境变量,可以在 docker run 命令中使用多个 --env 标志

sudo docker run -d \
    --name alpine_02 \
    --env "env01=value01" \
    --env "env02=value02" \
    --env "env03=value03" \
    alpine:3.21.3
sudo docker inspect alpine_02 | jq '.[].Config.Env'

在这里插入图片描述

3.2 使用--env-file标志和环境变量文件

可以创建一个环境变量文件,然后使用 docker run 命令启动容器时使用 --env-file 标志来指定环境变量文件

touch envFile
echo "env01=value01" >> envFile
echo "env02=value02" >> envFile
echo "env03=value03" >> envFile
sudo docker run -d \
    --name alpine_03 \
    --env-file envFile \
    alpine:3.21.3
sudo docker inspect alpine_03 | jq '.[].Config.Env'

如果没有安装 jq 工具,可以使用以下指令查看容器的环境变量

sudo docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' alpine_02

在这里插入图片描述

3. 在Dockerfile文件中设置容器的环境变量

对 Dockerfile 不是很了解的同学,可以阅读我的另一篇博文:Dockerfile详解(Dockerfile的基本结构、使用Dockerfile自定义镜像示例、主流编程语言和中间件的基础Docker镜像、编写Dockerfile的最佳实践)


如果在构建镜像时就想设置环境变量,可以在 Dockerfile 中使用 ENV 指令

4.1 创建 Dockerfile 文件

touch Dockerfile

4.2 在 Dockerfile 文件中填写环境变量

FROM alpine:3.21.3

ENV env01 value01
ENV env02 value02
ENV env03 value03

4.3 使用 Dockerfile 构建镜像

sudo docker build -t my-alpine:1.0.0 ./

在这里插入图片描述

4.4 启动容器

sudo docker run -d \
    --name my_alpine \
    my-alpine:1.0.0

4.5 查看容器内的环境变量

sudo docker inspect my_alpine | jq '.[].Config.Env'

如果没有安装 jq 工具,可以使用以下指令查看容器的环境变量

sudo docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' my_alpine

在这里插入图片描述

5. 在docker-compose.yaml中设置容器的环境变量

对 docker-compose 不是很了解的同学,可以阅读我的另一篇博文:DockerCompose详解(DockerCompose简介、docker-compose.yml文件的基本结构、常用的DockerCompose命令、docker-compose.yml文件示例)


如果你使用 docker-compose 来管理容器,可以在 docker-compose.yaml 文件中设置环境变量

5.1 使用environment标志

5.1.1 列表形式

services:
  web:  # 定义一个服务名称为 web
    image: nginx:1.27.3  # 指定服务使用的镜像
    environment:  # 定义环境变量
      - NGINX_HOST=example.com  # 设置单个环境变量
      - NGINX_PORT=8080  # 设置另一个环境变量
      - DEBUG=true  # 设置布尔值环境变量

5.1.2 字面量字典形式

services:
  web:
    image: nginx:1.27.3
    environment:
      NGINX_HOST: example.com
      NGINX_PORT: "8080"
      DEBUG: "true"

5.1.3 示例

进入 vim 编辑器的 paste 模式,接着切换成插入模式,防止直接粘贴导致的格式混乱

vim docker-compose-01.yaml
set paste

在这里插入图片描述

在这里插入图片描述

将以下内容粘贴到 docker-compose-01.yaml 文件中

services:
  my_alpine_01:
    image: alpine:3.21.3
    container_name: my_alpine_01
    environment:
      env_by_environment01: value01
      env_by_environment02: value02
      env_by_environment03: value03

  my_alpine_02:
    image: alpine:3.21.3
    container_name: my_alpine_02
    environment:
      env_by_environment01: value01
      env_by_environment02: value02
      env_by_environment03: value03

启动容器

sudo docker-compose -f docker-compose-01.yaml up -d

在这里插入图片描述

查看环境变量

sudo docker inspect my_alpine_01 | jq '.[].Config.Env'

如果没有安装 jq 工具,可以使用以下指令查看容器的环境变量

sudo docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' my_alpine_01

在这里插入图片描述

删除由 docker-compose-01.yaml 文件编排的所有容器

sudo docker-compose -f docker-compose-01.yaml down

在这里插入图片描述

5.2 使用env_file标志和环境变量文件

可以同时使用 environmentenv_file 来设置环境变量,其中 environment 中的变量会覆盖 env_file 中的同名变量

先创建两个配置文件

touch envFile01 envFile02

填充配置文件

echo "env_by_env_file_01=value01" >> envFile01
echo "env_by_env_file_02=value02" >> envFile01
echo "env_by_env_file_03=value03" >> envFile01

echo "env_by_env_file_01=value01" >> envFile02
echo "env_by_env_file_02=value02" >> envFile02
echo "env_by_env_file_03=value03" >> envFile02

进入 vim 编辑器的 paste 模式,接着切换成插入模式,防止直接粘贴导致的格式混乱

vim docker-compose-02.yaml
set paste

在这里插入图片描述

在这里插入图片描述

将以下内容填入 docker-compose-02.yaml 文件中

services:
  my_alpine_03:
    image: alpine:3.21.3
    container_name: my_alpine_03
    env_file: envFile01

  my_alpine_04:
    image: alpine:3.21.3
    container_name: my_alpine_04
    env_file: envFile02

启动容器

sudo docker-compose -f docker-compose-02.yaml up -d

在这里插入图片描述

查看环境变量

sudo docker inspect my_alpine_03 | jq '.[].Config.Env'

如果没有安装 jq 工具,可以使用以下指令查看容器的环境变量

sudo docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' my_alpine_03

在这里插入图片描述

删除由 docker-compose-02.yaml 文件编排的所有容器

sudo docker-compose -f docker-compose-02.yaml down

在这里插入图片描述

6. 注意事项

  • 环境变量的值如果包含空格或特殊字符,需要用引号括起来
  • docker run 命令通过 -e--env 指令设置的环境变量会覆盖 Dockerfile 中 ENV 指令设置的环境变量
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐