专业的编程技术博客社区

网站首页 > 博客文章 正文

如何将环境变量传递给 Docker 容器

baijin 2025-05-22 09:08:44 博客文章 1 ℃ 0 评论

技术背景

在使用 Docker 容器时,经常需要向容器内传递环境变量,例如数据库连接字符串、API 密钥等。这些环境变量可以用于配置容器内应用程序的行为,避免硬编码敏感信息,提高应用程序的灵活性和可配置性。

实现步骤

1. 使用 -e或 --env标志

在运行容器时,可以使用 -e--env 标志来传递单个或多个环境变量。例如:

docker run -e REDIS_NAMESPACE='staging' -e POSTGRES_ENV_POSTGRES_PASSWORD='foo' -it busybox sh

也可以从当前环境中获取变量值:

sudo PASSWORD='foo' docker run  [...] -e PASSWORD [...]

2. 使用 --env-file标志

如果有多个环境变量,特别是包含敏感信息的变量,可以使用 --env-file 标志指定一个环境变量文件。文件中的每一行应采用 VAR=VAL 格式。例如:

docker run --env-file ./env.list ubuntu bash

3. 在 docker-compose.yml中传递环境变量

在使用 docker-compose 启动容器时,可以在 docker-compose.yml 文件中传递环境变量。例如:

hapi_server:
  container_name: hapi_server
  image: node_image
  environment:
    - HAPI_DB_CONNECT=${NODE_DB_CONNECT}
  expose:
    - "3000"

4. 在 Dockerfile 中设置环境变量

可以在 Dockerfile 中使用 ENV 指令设置环境变量。例如:

ENV DATABASE_URL amazon:rds/connection?string

核心代码

使用 -e标志传递多个环境变量

sudo docker run -d -t -i -e REDIS_NAMESPACE='staging' \ 
-e POSTGRES_ENV_POSTGRES_PASSWORD='foo' \
-e POSTGRES_ENV_POSTGRES_USER='bar' \
-e POSTGRES_ENV_DB_NAME='mysite_staging' \
-e POSTGRES_PORT_5432_TCP_ADDR='docker-db-1.hidden.us-east-1.rds.amazonaws.com' \
-e SITE_URL='staging.mysite.com' \
-p 80:80 \
--link redis:redis \  
--name container_name dockerhub_id/image_name

使用 --env-file标志传递环境变量

docker run --env-file ./env.list ubuntu bash

在 docker-compose.yml中传递环境变量

version: '3.1'
services:
  my-service: 
    build:
      context: .
      args:
        - RAILS_ENV=${RAILS_ENV:-production}
    environment: 
      - RAILS_ENV=${RAILS_ENV:-production}

在 Dockerfile 中设置环境变量

FROM ruby:2.3.4
ARG RAILS_ENV=production
ENV RAILS_ENV $RAILS_ENV
RUN if [ "$RAILS_ENV" = "production" ] ; then echo "production env"; else echo "non-production env: $RAILS_ENV"; fi

最佳实践

  • 安全性:对于敏感信息(如数据库密码、API 密钥等),建议使用 --env-filedocker-compose 中的环境变量配置,并确保文件的访问权限得到严格控制。
  • 可维护性:将环境变量集中管理,避免在多个地方重复设置相同的变量。可以使用 .env 文件来存储通用的环境变量,并在 docker-compose.yml 中引用。
  • 灵活性:使用变量默认值和引用,例如 ${VAR:-default},以提高配置的灵活性。

常见问题

1. 环境变量未生效

确保 -e--env 标志在容器名称之前,并且环境变量的格式正确。例如:

# 错误示例
docker run -it ubuntu bash -e MY_VAR=value

# 正确示例
docker run -e MY_VAR=value -it ubuntu bash

2. --env-file中引号问题

docker run 命令在处理 --env-file 时,会将引号视为变量值的一部分。可以使用单引号替换双引号,或者使用更复杂的解决方案,如在容器内部设置环境变量。

3. docker-compose中环境变量未传递

确保在 docker-compose.yml 文件中正确引用了环境变量,并且 .env 文件存在且格式正确。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表