概述
将服务与其配置分离通常是一个好主意。对于一个十二因素应用,我们应该将配置存储在环境变量中。
当然,这意味着我们需要一种方法将配置注入到我们的服务中。
在本教程中,我们将通过向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容器的各种不同选项。
尽管每种方法都很好用,但我们的选择最终将取决于各种参数,如安全性与可维护性。