概述

将服务与其配置分离通常是一个好主意。对于一个十二因素应用,我们应该将配置存储在环境变量中。

当然,这意味着我们需要一种方法将配置注入到我们的服务中。

在本教程中,我们将通过向Docker容器传递环境变量来实现这一目标。

使用 –env-e

在本教程中,我们将使用一个小型(5MB)的Linux镜像Alpine。首先,让我们本地拉取这个镜像:

docker pull alpine:3

当我们启动Docker容器时,可以通过命令行直接以键值对的形式传递环境变量,使用参数 –env(或其简写 -e)。

例如,让我们执行以下命令:

$ docker run --env VARIABLE1=foobar alpine:3 env

简单地说,我们正在将之前设置的环境变量反射回控制台:

VARIABLE1=foobar

如图所示,Docker容器正确解释了变量 VARIABLE1

此外,如果变量已经在本地环境中存在,我们可以省略命令行中的值。

例如,让我们定义一个本地环境变量:

$ export VARIABLE2=foobar2

然后,让我们指定变量而没有其值:

docker run --env VARIABLE2 alpine:3 env

我们可以看到Docker仍然捕获到了这个值,这一次是从周围的环境中获取的:

VARIABLE2=foobar2

使用 –env-file

当变量数量较少时,上述解决方案是足够的。然而,一旦我们拥有的变量超过少数几个,它就可能会变得繁琐且容易出错。

另一种解决方案是使用文本文件来存储我们的变量,使用标准的 key=value 格式。

让我们在一个名为 my-env.txt 的文件中定义一些变量:

$ echo VARIABLE1=foobar1 > my-env.txt
$ echo VARIABLE2=foobar2 >> my-env.txt
$ echo VARIABLE3=foobar3 >> my-env.txt

现在,让我们将此文件注入到Docker容器中:

$ docker run --env-file my-env.txt alpine:3 env

最后,让我们查看输出结果:

VARIABLE1=foobar1
VARIABLE2=foobar2
VARIABLE3=foobar3

使用Docker Compose

Docker Compose 还提供了定义环境变量的功能。对这个特定主题感兴趣的读者可以参阅我们的Docker Compose教程以获取更多详细信息。

小心敏感值

通常,其中一个变量将是数据库或外部服务的密码。我们必须小心如何将这些变量直接注入到Docker容器中。

通过命令行直接传递这些值可能是最不安全的,因为存在更大的风险在我们不期望的地方泄露敏感值,例如在我们的源代码控制系统或操作系统进程列表中。

定义敏感值在本地环境或文件中是一个更好的选择,因为两者都可以防止未经授权的访问。

然而,重要的是要意识到任何具有Docker运行时访问权限的用户都可以检查正在运行的容器并发现秘密值。

让我们检查一个正在运行的容器:

对于那些关心安全的情况,需要提到的是,Docker提供了一种称为Docker Secrets的机制。像Kubernetes、AWS或Azure这样的容器服务也提供了类似的功能。

总结

在这篇简短的教程中,我们研究了将环境变量注入到Docker容器的各种不同选项。

尽管每种方法都很好用,但我们的选择最终将取决于各种参数,如安全性与可维护性。