是否可以在Docker容器中获取主机的环境变量?

时间:2016-12-07 11:56:22

标签: ruby-on-rails docker

我的应用使用了一些机密,就像数据库的密码一样。我不想在任何Docker文件或任何其他应用程序的文件中发布它。

是否可以在主机上设置环境变量,然后在我的应用程序的主机Docker容器上运行并使用Docker镜像中的主机环境变量?

我希望能够在我的Docker容器中输入类似的内容:

$ echo $DB_PASSWORD

但是DB_PASSWORD将在主机上设置。

主机与其容器之间是否共享环境变量?

3 个答案:

答案 0 :(得分:2)

环境变量不会在docker容器和主机os之间自动共享。

您可以使用run命令的"undefined"标志设置环境变量:

--env

要使用主机操作系统,环境变量不提供容器变量的值,将自动使用该变量的主机值。

$ docker run --env DB_PASSWORD="ohsosecret" someuser/someimage

official documentation

答案 1 :(得分:0)

在这里,我发布了解决方案,我如何处理秘密

  1. 我在本地机器上开发,并为发展为全球环境设置了秘密。
  2. 我通过受保护的Jenkins服务器将应用程序部署到测试/登台/生产环境。 Jenkins运行脚本,为每个测试/暂存/生产设置环境变量。
  3. 对于每个环境,我都有特定的 docker-compose-xxx.yml ,例如: docker-compose-development.yml docker-compose- jenkins.yml docker-compose-production.yml 等。
  4. docker-compose-xxx.yml 文件中,我使用本地环境变量,例如:
  5. # docker-compose-development.yml
    
    version: '2'
    services:
      app:
        image: app_development
        build:
          context: ./app
          dockerfile: Dockerfile.development
        links:
          - db
        environment:
          DB_USER: ${DB_DEVELOP_USER}
          DB_PASS: ${DB_DEVELOP_PASS}
      db:
        image: mysql:latest
        ports:
          - "3306:3306"
        environment:
          MYSQL_ROOT_PASSWORD: ${DB_DEVELOP_USER}
          MYSQL_USER: root
          MYSQL_PASSWORD: ${DB_DEVELOP_PASS}
          MYSQL_DATABASE: app_development
    
    # docker-compose-test.yml
    
    version: '2'
    services:
      app:
        image: app_development
        build:
          context: ./app
          dockerfile: Dockerfile.test
        links:
          - db
        environment:
          DB_USER: ${DB_TEST_USER}
          DB_PASS: ${DB_TEST_PASS}
      db:
        image: mysql:latest
        ports:
          - "3306:3306"
        environment:
          MYSQL_ROOT_PASSWORD: ${DB_TEST_USER}
          MYSQL_USER: root
          MYSQL_PASSWORD: ${DB_TEST_PASS}
          MYSQL_DATABASE: app_test
    
    1. 我使用这种方法来构建Ruby on Rails应用程序。此框架使用 config / database.yml ,其中设置了一些机密数据(如数据库密码)。提出的方法允许使用在docker-compose-xxx.yml文件中导出的环境变量:
    2.     default: &default
            adapter: mysql2
            encoding: utf8
            pool: 5
            socket: /var/run/mysqld/mysqld.sock
      
          development:
            adapter: mysql2
            encoding: utf8
            pool: 5
            socket: /var/run/mysqld/mysqld.sock
            database: app_development
            host: 'db'
            port: 3306
            username: 
            password: 
      
          test:
            adapter: mysql2
            encoding: utf8
            pool: 5
            socket: /var/run/mysqld/mysqld.sock
            database: app_test
            host: 'db'
            port: 3306
            username: 
            password: 
      

答案 2 :(得分:0)

您可以使用以下命令行语句共享主机环境变量

docker run --name mycontainer -e your_host_variable image-name

或者您可以使用文件从那里获取所有环境变量

有关更多详细信息,请参阅this,这是一个不错的博客。