在 Docker 及编排工具(如 Docker Compose、Kubernetes)中,设置环境变量的方式有多种,以下是详细的分类和说明:
1. Dockerfile 中设置环境变量
1.1 ENV
指令
-
作用:定义容器运行时的环境变量,可被后续指令或容器内进程使用。
-
特点:
- 持久化到镜像中,容器启动后默认存在。
- 可被
docker run --env
覆盖。
-
示例:
dockerfileENV APP_VERSION=1.0 ENV DB_HOST=db.example.com
1.2 ARG
指令
-
作用 :定义构建时的变量(仅在
Dockerfile
构建阶段有效)。 -
特点:
- 通过
--build-arg
传递,构建完成后不再存在。 - 常用于动态传入构建参数(如版本号、仓库地址)。
- 通过
-
示例:
dockerfileARG APP_VERSION=1.0 RUN echo "Building version ${APP_VERSION}"
bashdocker build --build-arg APP_VERSION=2.0 -t myapp .
1.3 通过 Shell 传递
-
在
RUN
指令中直接使用 Shell 变量(临时生效):dockerfileRUN export TMP_DIR=/tmp && echo $TMP_DIR
2. docker run
命令行设置
2.1 -e
或 --env
-
作用:动态设置容器启动时的环境变量。
-
示例:
bashdocker run -e APP_MODE=production -e DB_HOST=db.example.com myimage
2.2 --env-file
-
作用 :从文件加载环境变量(文件格式为
VAR=value
)。 -
示例:
bashdocker run --env-file .env myimage
3. Docker Compose 中设置环境变量
3.1 environment
字段
-
作用 :直接在
docker-compose.yml
中定义变量。 -
示例:
yamlservices: web: environment: - APP_MODE=production - DB_HOST=db
3.2 env_file
字段
-
作用:从文件加载变量(支持多个文件)。
-
示例:
yamlservices: web: env_file: - .env - secrets.env
3.3 动态变量(${VAR}
)
-
作用:引用宿主机或 Compose 文件中的变量。
-
示例:
yamlservices: web: environment: - APP_VERSION=${APP_VERSION:-1.0} # 默认值
4. Kubernetes 中设置环境变量
4.1 env
字段
-
作用:在 Pod 的容器配置中直接定义。
-
示例:
yamlcontainers: - name: myapp env: - name: APP_MODE value: "production"
4.2 envFrom
字段
-
作用:从 ConfigMap 或 Secret 批量加载变量。
-
示例:
yamlenvFrom: - configMapRef: name: app-config - secretRef: name: app-secrets
4.3 ConfigMap 和 Secret
-
ConfigMap:存储非敏感配置。
yamlenv: - name: DB_HOST valueFrom: configMapKeyRef: name: db-config key: host
-
Secret:存储敏感数据(如密码)。
yamlenv: - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password
5. 其他方式
- Shell 传递 :在容器启动脚本中通过
export
设置(临时生效)。 - Entrypoint 脚本:在容器的入口脚本中动态生成变量。
最佳实践建议
- 敏感信息:使用 Kubernetes Secrets 或 Docker Secrets,避免硬编码。
- 环境差异 :通过
env_file
或 ConfigMap 区分不同环境(开发、生产)。 - 构建与运行时分离 :
ARG
用于构建阶段,ENV
和运行时变量用于容器运行。
通过灵活组合这些方式,可以高效管理容器化应用的环境配置。