如何限制传递给链接容器的环境variables

我们已经开始广泛使用docker(我们喜欢它),但是却发现了一个相当讨厌的安全问题。 链接的容器可以完全访问源容器的环境设置。

例如,假设你创build一个mysql容器。

docker run --name db -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql 

现在你创build一个wordpress容器

 docker run --name wp --link db:db \ -e WORDPRESS_DB_USER=wp \ -e WORDPRESS_DB_PASSWORD=1234 \ -d wordpress 

如果您现在检查wordpress容器中的环境,您将能够看到mysql root密码。

 docker exec -i wp sh -c "env|grep ^MYSQL_MYSQL_ENV" MYSQL_ENV_MYSQL_MAJOR=5.7 MYSQL_ENV_MYSQL_ROOT_PASSWORD=mysecretpassword MYSQL_ENV_MYSQL_VERSION=5.7.5-m15 

这是一个重大的安全漏洞! wordpress容器内的任何随机代码或模块都可能使用mysql root密码连接和破坏。 如果mysql数据库与多个wordpress容器(和joomla容器)共享,那么这个浩劫可能是全球性的。

我的问题是,有没有办法限制什么环境variables之间的链接容器传递?

第二个问题 – 我仔细审查了链接容器的文档https://docs.docker.com/userguide/dockerlinks/#environment-variables

但它不描述这种行为。 我想也许这是一个意想不到的副作用,也许我应该打开一个错误报告?

我的问题是,有没有办法限制什么环境variables之间的链接容器传递?

如果这是您的环境中的一个问题,您最好的select可能是采用容器链接以外的解决scheme来进行服务发现。 例如,你可以使用各种etcd backed发现机制之一 – 直接使用etcd ,或者诸如领事 , 注册者或者skydns之类的东西 。