2017-03-29 83 views
0

我的泊塢窗容器和環境變量遇到了一些問題。將Docker部署到遠程主機時傳遞環境變量

目前我有一個搬運工-compose.yml與以下定義:

version: '2.1' 
services: 
    some-service: 
    build: 
     context: . 
    image: image/replacedvalues 
    ports: 
     - 8080 
    environment: 
     - PROFILE=acc 
     - ENVA 
     - ENVB 
     - TZ=Europe/Berlin 

    some-service-acc: 
    extends: 
     service: some-service 
    environment: 
     - SERVICE_NAME=some-service-acc 

現在,當我手動部署此(通過SSH命令直接線)在服務器A上,將採取的環境變量從服務器A並將它們放入我的容器中。因此,我的容器中的主機的值爲ENVAENVB。使用以下命令(在建立課程圖像之後):docker-compose up some-service-acc

我們目前正在開發更好的基礎架構,並希望通過Jenkins部署服務。 Jenkins已啓動並運行在服務器B上的泊塢窗容器中。

我可以通過Jenkins(Job-DSL,設置DOCKER_HOST =「tcp:// serverA:2375」臨時)部署服務。因此,它將在服務器B上的Jenkins容器上運行ServerA上的所有docker(組合)命令。該服務已啓動並正在運行,但它沒有ENVAENVB的值。

詹金斯運行與作業-DSL Groovy腳本如下:

withEnv(["DOCKER_HOST=tcp://serverA:2375"]) { 
    sh "docker-compose pull some-service-acc" 
    sh "docker-compose -p some-service-acc up -d some-service-acc" 
} 

我想在我的詹金斯容器和服務器B本身,但既不工作設置它們。只有當我直接在服務器A上手動部署時,它纔有效。

當我使用泊塢窗檢查檢查正在運行的容器中,我得到了env塊以下的輸出:

"Env": [ 
    "PROFILE=acc", 
    "affinity:container==JADFG09gtq340iggIN0jg53ij0gokngfs", 
    "TZ=Europe/Berlin", 
    "SERVICE_NAME=some-service-acc", 
    "ENVA", 
    "ENVB", 
    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 
    "LANG=C.UTF-8", 
    "JAVA_VERSION=8", 
    "JAVA_UPDATE=121", 
    "JAVA_BUILD=13", 
    "JAVA_PATH=e9e7ea248e2c4826b92b3f075a80e441", 
    "JAVA_HOME=/usr/lib/jvm/default-jvm", 
    "JAVA_OPTS=" 
] 

我在哪裏需要設置環境變量,以便它們將被傳遞到容器?我更喜歡將變量存儲在服務器A上。但如果這是不可能的,有人可以向我解釋它是如何實現的嗎?它是而不是的一個選項,用於硬編碼撰寫文件或源文件中任何其他位置的值,因爲它們包含敏感數據。

如果我在錯誤的地方問這個問題,請將我重定向到我應該在的地方。

謝謝!

回答

2

您需要在運行docker-compose命令行的shell中設置環境變量。在詹金斯,這是最好的做法是你的Groovy腳本中(詹金斯沒有使用構建從內部主機環境):

withEnv(["DOCKER_HOST=tcp://serverA:2375", "ENVA=hello", "ENVB=world"]) { 
    sh "docker-compose pull some-service-acc" 
    sh "docker-compose -p some-service-acc up -d some-service-acc" 
} 

編輯:從評論,您也想通過祕密。

要做到這一點,有像Mask Password這樣的插件可以讓您傳遞變量,而不會在日誌或作業配置中顯示它們。 (我相當肯定一個確定的入侵者仍然可以達到價值,因爲詹金斯本身知道它並將其以明文形式傳遞給您的腳本。)

更好的選項IMO是在碼頭中使用祕密管理工具。Hashicorp has their Vault product,它實現了一個加密的K/V存儲,其中的值通過一個時間有限的令牌來訪問,並且提供了在每個請求中爲目標系統集成而生成新密碼的能力。我認爲這是完全配置時的最高安全級別,但您可以配置這種無數種方式來滿足您的需求。您需要編寫一些東西來提取祕密並將其注入到您的容器環境中(這是您可以添加到入口點的休息協議)。

Docker本身的最新選項是祕​​密管理,需要新的Swarm模式。你將你的祕密保存在swarm中,並使用entry in the docker-compose.yml version 3 format作爲文件將它添加到你想要的容器中。如果您已經使用Swarm模式,並且可以使用docker stack deploy而不是docker-compose啓動容器,則這是一個相當容易實現的解決方案。

+0

硬編碼不是我的選擇,因爲它包含敏感數據,我也不需要每個部署的環境變量,只有部署到ServerA的服務。但是,如果我得到它的權利,除'DOCKER-HOST'之外的'docker-compose'命令時沒有其他環境變量? – Clemenz

+1

DOCKER_HOST,一個最小的PATH,以及由Jenkins定義的各種變量。還有其他選擇的祕密,我會更新我的答案。 – BMitch

+0

感謝您的廣泛答覆。我會接受它作爲正確的答案。有很多東西需要研究。感謝所有的信息。 – Clemenz