Docker镜像中如何设置环境变量

在使用 ref="/tag/2019/" style="color:#3D6345;font-weight:bold;">Docker 部署应用时,经常需要根据不同的运行环境调整配置,比如开发、测试和生产环境的数据库地址不一样。这时候,环境变量就派上用场了。通过设置环境变量,可以让同一个镜像在不同场景下灵活运行,不用每次都重新构建镜像。

在 Dockerfile 中设置环境变量

最常见的方式是在构建镜像时通过 Dockerfile 定义环境变量。使用 ENV 指令就可以实现。比如你想让应用默认监听 3000 端口,可以在 Dockerfile 中这样写:

FROM node:16
ENV PORT=3000
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]

构建出来的镜像会自带这个环境变量,容器启动后可以直接在程序里读取 process.env.PORT(如果是 Node.js 应用)。

运行容器时传入环境变量

更灵活的做法是在启动容器时动态传入变量。比如生产环境要用 80 端口,可以这样运行:

docker run -e PORT=80 my-web-app

这里的 -e 参数就是用来设置环境变量的。如果变量很多,比如数据库连接信息、API 密钥等,可以写成一个文件,比如 .env

DB_HOST=localhost
DB_PORT=5432
API_KEY=abc123xyz

然后用 --env-file 加载:

docker run --env-file ./.env my-web-app

这种方式特别适合把敏感信息或变动频繁的配置从镜像中剥离出来。

在 docker-compose 中设置

如果你用 docker-compose.yml 管理多个服务,设置环境变量更直观。可以直接在配置文件里写:

version: '3'
services:
  web:
    image: my-web-app
    environment:
      - PORT=80
      - NODE_ENV=production
    env_file:
      - ./.env

这样既可以用 environment 直接定义,也能通过 env_file 批量加载,组合使用很灵活。

注意事项

环境变量虽然方便,但不适合存放敏感数据,比如密码、密钥。因为它们可能被意外打印到日志里。更安全的做法是使用 Docker 的 secrets 或 volumes 来管理机密信息。

另外,如果在多个地方设置了同一个变量,优先级顺序是:命令行 -e > env_file > Dockerfile 中的 ENV。后面的会覆盖前面的,这一点在调试时要特别注意。