2014-12-30 96 views
34

我的具體使用案例是,我想組織有關運行容器的EC2實例的一些數據,並使其作爲環境變量提供。我想在容器建成時這樣做。在構建時在Docker中創建動態環境變量

我希望能夠在我的Dockerfile中做類似ENV VAR_NAME $(./script/that/gets/var)的事情,但毫不奇怪,這是行不通的(你只是得到字符串$(./script...)。

我應該提到,我知道docker run --env...會這樣做,但我特別希望它被構建到容器中。

我錯過了一些明顯的東西嗎?這甚至有可能嗎?

+0

您想要什麼時候運行'。/ script/that/gets/var'? Docker文件用於構建時間。如果你想在容器啓動時運行一些東西,只需創建一個腳本,該腳本運行'./ script/that/gets/var',然後是主命令。 – generalhenry

+0

我希望它在構建時運行並創建將在運行時出現的環境變量。 – Evan

回答

28

泊塢V1.9以上版本

如果您使用的碼頭工人V1.9或更高版本,這對於通過構建時間參數的支持是可能的。參數Dockerfileusing the ARG statement聲明。

ARG REQUIRED_ARGUMENT 
ARG OPTIONAL_ARGUMENT=default_value 

當你使用docker build後真正建立你的形象,你可以作爲docker docs描述通過標誌--build-arg傳遞參數。

$ docker build --build-arg REQUIRED_ARGUMENT=this-is-required . 

請注意,這是不推薦使用編譯時變量密碼或祕密,如按鍵或憑證。

此外,構建時變量可能有great impact on caching。因此,應該非常小心地構建Dockerfile,以儘可能地利用緩存,並在其中加速構建過程。

編輯:「docker比v1.9更新」 - 部分是在leedm777:s answer輸入後添加的。


泊塢V1.9

如果您之前1.9使用泊塢版本之前,該ARG/--build-arg的做法是不可能的。在構建過程中無法解析此類信息,因此您必須將它們作爲參數傳遞給docker run命令。

Docker 圖片隨着時間的推移將保持一致,而容器可以被調整並被視爲「丟棄過程」。

老辦法解決這個問題是使用模板。這不是一個很好的解決方案,但是當時很少有可行的選擇之一。 (來自this discussion的啓示)。

  1. 保存在一個JSON或YAML文件
  2. 創建一個泊塢窗文件「模板」,其動態以後可以擴展
  3. 編寫使用一些從配置數據創建一個Dockerfile腳本的所有動態數據模板庫,你所熟悉的
+0

回覆:「碼頭圖像的目的是非常一致的」,我明白了,但這是專門關於容器,它有各種動態的東西。 – Evan

+0

我的用例模板方法的問題在於,應用程序在Elastic Beanstalk上運行,構建步驟由服務控制,因此我無法在我真正關心的地方編譯我的模板(儘管它肯定會解決其他用例的這個問題)。 – Evan

+0

@Evan聽到聽到,棘手的問題。然後答案是:不 - 你沒有錯過任何明顯的東西,這是不可能的;) – wassgren

30

碼頭1.9 has added support for build time arguments

在你的Dockerfile,你的add an ARG statement,它有一個類似於ENV的語法。

ARG FOO_REQUIRED 
ARG BAR_OPTIONAL=something 

在構建時,您可以通過pass a --build-arg argument來設置該構建的參數。必須指定在Dockerfile中沒有給出默認值的任何ARG

$ docker build --build-arg FOO_REQUIRED=best-foo-ever . 
+4

旁邊的問題......這是如何傳遞到一個彈性beanstalk構建? AFAIK您無法向Elastic Beanstalk上的Docker部署提供構建命令。 – user1658296