2016-12-07 105 views
1

我的應用程序使用一些機密,如密碼到數據庫。我不想在任何Docker文件或任何其他應用程序的文件中發佈它。是否有可能在Docker容器中獲取主機的環境變量?

是否可以在主機上設置環境變量,然後在該主機的Docker容器上運行我的應用程序並在Docker映像中使用主機的環境變量?

我希望能在我的碼頭工人容器像獲得:

$ echo $DB_PASSWORD 

但DB_PASSWORD將主機上設置。

環境變量是否在主機及其容器之間共享?

回答

2

環境變量不會在Docker容器和主機操作系統之間自動共享。

您可以設置環境變量與運行命令的--env標誌,但:

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

要使用您的主機操作系統的環境變量不提供容器變量的值,該變量的主機值將是自動使用。

$ docker run --env DB_PASSWORD someuser/someimage 

official documentation

+0

感謝您的回答。我意識到這個解決方案,但我會使用一些解決方法如何處理*祕密* - 在我自己的答案更多的細節(也許這將是有用的人)。 – nicq

0

我在這裏發佈我的解決方案,我如何與祕密工作。

  1. 我在本地機器上開發,併爲開發作爲全球環境設定了祕密。
  2. 我通過受保護的Jenkins服務器將應用程序部署到測試/登臺/生產環境。詹金斯運行爲每個測試/分期/生產設置環境變量的腳本。
  3. 對於每個環境,我有特定搬運工-撰寫-xxx.yml,例如:搬運工-撰寫-development.yml搬運工-撰寫-jenkins.yml搬運工-撰寫生產。陽明
  4. 泊塢窗,撰寫-xxx.yml文件,我使用本地的環境變量,例如:
 
# 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其中設置了一些機密數據(如數據庫密碼)。提出的方法允許使用在泊塢窗,撰寫-xxx.yml文件導出的環境變量:
 
    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: 
+0

這不是一個合適的祕密管理解決方案,它只是schrej的解決方案,但是在'docker-compose'中使用相同的環境變量,而不是直接在'docker run'cli中傳遞。祕密管理將在1.13年推出,或者您可以設置像Vault這樣的解決方案。 – BMitch

+0

現在是問這個Q和A自己的事情嗎?我在最後幾天經常見到這種情況。 – Gabbax0r

相關問題