程序通常通过与软件捆绑的配置来控制操作,而环境变量允许用户在运行时设置它们。但是,在 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
文件中允许您使用文件权限 ( chmod
, chown
)控制对该文件的访问。
.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 容器