Docker 容器中的环境变量(用 设置-e
)可用于每个链接的容器。
考虑一个典型的用例,一个数据库。MySQL 官方镜像给出了这个示例命令:
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
我刚刚将密码作为明文放入环境变量中。可以肯定的是,你需要docker inspect
看到它,如果你能做到这一点,这意味着你有主机操作系统的 root 访问权限,无论如何这已经结束了......所以让我们继续吧。
现在我也想建立一个wiki。让我们使用这个 MediaWiki 图像。我们还需要链接数据库:
docker run --name some-mediawiki --link some-mysql:mysql -d synctree/mediawiki
哎呀!当我链接some-mysql
时,环境变量传播了,现在some-mediawiki
也可以看到MYSQL_ROOT_PASSWORD
了!这意味着,如果有人要破坏 wiki,他们可能还可以找到 root 密码,然后通过链接进入数据库。
Docker 开发人员对此进行了一些讨论,得出的结论是环境变量从来都不是用来安全地共享秘密的,以这种方式使用它们是错误的。然而,我一直看到图像将密码作为环境变量传递,甚至许多官方数据库图像都这样做。为什么?