是否有可能在Docker容器中获取主机的环境variables?
我的应用程序使用一些秘密 ,如密码到数据库。 我不想在任何Docker文件或任何其他应用程序的文件中发布它。
是否有可能在主机上设置环境variables,然后在我的应用程序上运行在这个主机的Docker容器上,并在Docker镜像里面使用主机的环境variables?
我想能够在我的Docker容器中得到如下所示:
$ echo $DB_PASSWORD
但DB_PASSWORD将在主机上设置。
主机与其容器之间是否共享环境variables?
Docker容器和主机操作系统之间的环境variables不会自动共享。
你可以用run命令的--env
标志来设置环境variables,但是:
$ docker run --env DB_PASSWORD="ohsosecret" someuser/someimage
要使用你的主机os的环境variables不提供一个容器variables的值,这个variables的主机值将被自动使用。
$ docker run --env DB_PASSWORD someuser/someimage
官方文件
在这里,我张贴我的解决scheme如何处理秘密 。
- 我在本地机器上开发,为全球环境的发展树立了秘密。
- 我通过受保护的Jenkins服务器将应用程序部署到testing/登台/生产环境。 Jenkins运行为每个testing/分期/生产设置环境variables的脚本。
- 对于每个环境,我都有特定的docker-compose-xxx.yml ,例如: docker -compose-development.yml , docker-compose-jenkins.yml , docker -compose-production.yml等
- 在docker-compose-xxx.yml文件中,我使用本地环境variables,例如:
#docker-compose-development.yml 版本:'2' 服务: 应用: 图片:app_development build立: 上下文:./app dockerfile:Dockerfile.development 链接: - D b 环境: DB_USER:$ {DB_DEVELOP_USER} DB_PASS:$ {DB_DEVELOP_PASS} D b: image:mysql:latest 端口: - “3306:3306” 环境: MYSQL_ROOT_PASSWORD:$ {DB_DEVELOP_USER} MYSQL_USER:root MYSQL_PASSWORD:$ {DB_DEVELOP_PASS} MYSQL_DATABASE:app_development
#docker-compose-test.yml 版本:'2' 服务: 应用: 图片:app_development build立: 上下文:./app dockerfile:Dockerfile.test 链接: - D b 环境: DB_USER:$ {DB_TEST_USER} DB_PASS:$ {DB_TEST_PASS} D b: image:mysql:latest 端口: - “3306:3306” 环境: MYSQL_ROOT_PASSWORD:$ {DB_TEST_USER} MYSQL_USER:root MYSQL_PASSWORD:$ {DB_TEST_PASS} MYSQL_DATABASE:app_test
- 我使用这种方法来构buildRuby on Rails应用程序。 这个框架使用config / database.yml来设置一些机密数据(如数据库密码)。 提出的方法允许使用在docker-compose-xxx.yml文件中导出的环境variables:
默认:&默认 适配器:mysql2 编码:utf8 游泳池:5 socket:/var/run/mysqld/mysqld.sock 发展: 适配器:mysql2 编码:utf8 游泳池:5 socket:/var/run/mysqld/mysqld.sock 数据库:app_development 主机:'db' 港口:3306 用户名: 密码: testing: 适配器:mysql2 编码:utf8 游泳池:5 socket:/var/run/mysqld/mysqld.sock 数据库:app_test 主机:'db' 港口:3306 用户名: 密码: