如何设置 Docker 环境变量?
Docker 是一款多功能工具,可确保在不同平台之间保持统一的开发环境。Docker 中的环境变量在配置 Docker 容器内的应用程序时发挥着重要作用。
在本指南中,您将了解 Docker 环境变量的基本知识,以及如何通过多种方法设置 Docker 环境变量,包括通过 Docker CLI 命令和 Docker Compose 设置或覆盖它们,同时介绍一些值得遵循的最佳实践。
什么是 Docker 环境变量?
Docker 环境变量是影响容器内所有应用程序的预定义值。它们有多种用途,例如定义应用程序行为、为 Docker 镜像设置配置参数,以及安全地存储数据库凭据和 API 密钥等敏感信息。
这些变量对于提升容器的可移植性和灵活性非常重要。借助环境变量,您可以根据部署环境调整设置,而无需重新构建镜像。这使得配置可以在运行时注入,确保容器能够在不同环境中运行,并提升其整体可移植性。只有在服务配置中显式定义时,才会设置容器的环境。
如何在 Dockerfile 中设置 Docker 环境变量?
Dockerfile 定义了构建 Docker 镜像所需的全部步骤,并允许您定义两种类型的变量:
ENV: Environment variables
ARG: Build-time variables
ENV 变量
使用 ENV 指定的环境变量会应用于基于该镜像创建的所有容器。在 Dockerfile 中设置环境变量的格式如下:
ENV env_variable_name=value
ARG 变量
构建时变量使用 ARG 定义,可以在构建时传入。
以下是一个使用环境变量的 Dockerfile 示例:
# Use an official Node.js runtime as a parent image
FROM node:14
# Set environment variables
ENV NODE_ENV=production
ENV PORT=3000
# Set the working directory
WORKDIR /usr/src/app
# Copy package.json and package-lock.json
COPY package*.json ./
# Install dependencies
RUN npm install
# Copy the rest of the application code
COPY . .
# Expose port 3000
EXPOSE 3000
# Run the app
CMD ["npm", "start"]
在这个示例中,NODE_ENV 和 PORT 是使用 ENV 指令设置的环境变量。基于此 Dockerfile 构建的任何容器都可以使用这些变量。
查看 Docker 环境变量:在 Docker 容器中查看和管理变量
为了查看在 Docker 容器或镜像中设置的环境变量,Docker 提供了多种用于调试和检查的方法。
1. 使用 docker inspect 命令
docker inspect 命令可以查看容器或镜像的详细信息,包括 Docker 环境变量。使用方法如下:
docker inspect --format '{{.Config.Env}}' <containerId_or_imageId>
将 <containerId_or_imageId> 替换为您的容器或镜像的实际 ID。该命令会以格式化的 JSON 输出仅获取并显示 Docker 环境变量(Env)。它便于快速检查 Docker 实例中当前配置了哪些变量。
2. 使用 docker exec 命令
查看已配置 Docker 环境变量的另一种方法是使用 docker exec 命令。操作方法如下:
docker exec <containerID> env
将 <containerID> 替换为正在运行的容器的 ID。该命令会在指定容器内执行 env 命令,列出其中当前设置的所有环境变量。
如何使用 Docker Compose 设置 Docker 环境变量?
对于多容器应用程序来说,在运行时使用 CLI 设置 Docker 环境变量并不理想。更好的方法是使用 docker-compose.yml 文件定义所有环境变量。该文件包含容器所需的全部配置,启动容器时只需一条命令即可应用。要使用 Docker Compose 在容器中设置环境变量,必须在服务配置中显式定义这些变量。
使用 Docker Compose 设置 Docker 环境变量有两种方法:
1. 使用 environment 属性
在这种方法中,您直接在 docker-compose.yml 文件中使用 environment 属性定义环境变量。例如,我们有一个使用 MongoDB 数据库的 Node 应用程序:
Docker compose 文件:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- PORT=3000
- MONGO_URI=mongodb://mongo:27017/database_name
depends_on:
- mongo
mongo:
image: mongo:4.4
ports:
- "27017:27017"
volumes:
- mongo-data:/data/db
volumes:
mongo-data:
2. 使用 .env 或 env_file 属性
在这种方法中,您将 Docker 环境变量存储在单独的 .env 文件中,并在 docker-compose.yml 文件中引用该文件。
以下是 .env 文件:
PORT=3000
MONGO_URI=mongodb://mongo:27017/database_name
Docker compose 文件:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
env_file:
- .env
depends_on:
- mongo
mongo:
image: mongo:4.4
ports:
- "27017:27017"
volumes:
- mongo-data:/data/db
volumes:
mongo-data:
使用 .env 文件既灵活又方便,您可以在 docker run --env-file ... 命令中使用同一个文件,或在 Docker Compose 的多个服务之间共享它,而无需在 YAML 配置中重复冗长的环境变量部分。
这种方法将环境变量与主配置文件分开,提升了组织性和安全性。不将 .env 文件直接放在根目录中,可以更好地管理敏感信息。
env_file 属性还支持在一个 Compose 应用中使用多个 .env 文件。在 env_file 属性中为这些 .env 文件指定的路径,是相对于 docker-compose.yml 文件所在位置的。
3. 在运行时使用 docker compose 设置 Docker 环境变量
Docker compose 允许您通过命令行的 --env-file 选项设置 Docker 环境变量。
docker compose --env-file <environmental_variables_file> up
现在,向 .env 文件中添加新的示例环境变量。
MONGODB_PASSWORD=test
运行应用程序并查看已配置的 Docker 环境变量。
4. 使用 Docker Compose run 设置一次性 Docker 环境变量
当使用 docker compose run 为一次性运行的容器设置环境变量时,可以通过 -e 或 --env-file 选项指定这些变量。这种方法与 docker run 类似,允许您仅针对该特定容器实例覆盖或设置环境变量。
例如,要修改 Web 应用程序容器中的 DEBUG 变量,可以执行:
docker compose run -e DEBUG=0 web
该命令仅在本次运行期间将 web 服务/容器的 DEBUG 变量设置为 0,使环境满足该执行上下文的即时需求。
设置 Docker 环境变量的最佳实践有哪些?
设置 Docker 环境变量时,应遵循以下最佳实践,以确保安全性、一致性和可维护性:
- 使用 .env 文件:将环境变量存储在单独的 .env 文件中。这有助于在不同环境(开发、测试、生产)之间组织变量。请确保将 .env 文件添加到 .gitignore 中,防止敏感数据被提交到版本控制系统。
- 加密敏感数据:避免以明文形式直接存储密码和 API 密钥等敏感信息,而应使用加密方式安全存储,并在需要时在应用程序内解密这些变量。
- 避免运行时更改:不要在运行中的容器内更改环境变量。这样可以确保不同环境之间的一致性。如需更改,请停止容器,修改后再启动新实例。
- 使用标准命名规范:为环境变量使用统一的命名规范以保持一致性,这样更便于管理和理解变量的用途。
- 定期维护:定期检查和更新 Docker 环境变量,确保它们是最新且相关的。删除或更新过时的变量,以保持清晰和高效。
总结
本指南介绍了 Docker 环境变量在保持应用程序跨平台行为一致方面的重要性。我们讨论了如何在 Dockerfile 中定义这些变量,以及如何使用 CLI 命令和 Docker Compose 调整它们。遵循最佳实践,您可以安全地管理敏感数据,借助 Docker Compose 确保配置一致,并提升部署效率。
BlueVPS 提供兼具类云可用性的高性能 VPS 解决方案,带来简单、可扩展且可定制的环境,非常适合 Docker 部署。享受独享资源和不限流量,让您的 Docker 化应用获得强劲性能和无缝扩展能力。