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

70edc0293b25442

程序通常通过与软件捆绑的配置来控制操作,而环境变量允许用户在运行时设置它们。但是,在 Docker 容器中运行进程会使事情变得复杂,那么如何将环境变量传递给容器呢?

环境变量有什么用?

环境变量允许您将配置与应用程序的可执行文件分离。例如,您不希望将您的生产数据库密码存储在您的代码库中——如果您这样做了,它将从 Git 中可见,并且任何有权访问您代码的人都可以删除您的数据库。

相反,您可以使用环境变量设置它,该变量存储一个简单的键值对,并允许您访问在同一 shell 会话中运行的任何应用程序中的值(它们不可全局访问)。这还有一个好处是能够轻松地为不同的环境定义不同的配置。例如,为开发和生产数据库设置单独的密钥,或使用不同的 API 端点。

可以通过三种主要方式为 Docker 容器设置这些变量——使用 CLI 参数、.env配置文件或通过docker-compose.

使用命令行参数

用于启动 Docker 容器的命令docker run接受 ENV 变量作为参数。只需使用-e 标志运行它,简写为--env,并传入 key=value 对:

须藤码头运行\
-e POSTGRES_USER='postgres' \
-e POSTGRES_PASSWORD='密码' \
...

而且,如果您已经在运行该命令的环境中设置了这些环境变量,则可以直接按名称传递它们:

// 设置变量
POSTGRES_PASSWORD='密码'

// 稍后使用
码头工人运行 -e POSTGRES_PASSWORD -e POSTGRES_USER ...

.env 文件的额外安全性

使用 CLI 参数传递变量效果很好,但它有一个缺点——这些变量在主机上是可见的。它们记录在命令历史记录中,并在启动进程的进程列表中可见。

Linux 有一种内置的方式来管理此权限——文件访问。将变量存储在 .env文件中允许您使用文件权限 ( chmodchown)控制对该文件的访问。

.env 使用以下格式的变量创建一个文件,每个变量占一个新行:

POSTGRES_PASSWORD='密码'
POSTGRES_USER='postgres'
APPLICATION_URL='example.com'

然后,将其docker run 与--env-file 标志一起传递给:

docker run --env-file ./envfile ...

使用 Docker-Compose

当然,许多人不直接使用 启动 Docker 容器docker run,而是选择使用docker-compose 文件来处理所有代表单个应用程序的多个容器的配置。

要将环境变量传递给以这种方式启动的容器,您必须配置撰写文件以将会话的变量传递给 Docker 容器。这里的配置将POSTGRES_USER 变量同时传递给构建环境和运行时环境,如果不存在则设置一个默认值。

版本:'3.1'
服务:
  我的服务: 
    建造:
      语境: 。
      参数:
        - POSTGRES_USER=${POSTGRES_USER:-default}
    环境: 
      - POSTGRES_USER=${POSTGRES_USER:-default}

您需要在运行之前设置环境变量docker-compose up,否则将无法访问它们。您可以将它们存储在 compose 文件中,但这通常会被跟踪和版本化,这违背了 env 变量的目的。

使用 Kubernetes

Kubernetes 是一个编排系统,可以处理在网络上运行的数百个容器。它仍然使用 Docker,但您只会接触配置,因此直接传递环境变量是行不通的。

相反,您可以在 Pod 的配置中定义它们:

api版本:v1
种类:豆荚
元数据:
  名称:示例
规格:
  容器:
    - ...
      NS:
        - 名称:SERVICE_PORT
          值:“80”
        - 名称:SERVICE_IP
          值:“172.17.0.1”

Kubernetes 很复杂,有很多不同的方式来处理环境变量。

未经允许不得转载:表盘吧 » 如何将环境变量传递给 Docker 容器