2015-10-18 30 views
2

一命令的結果我需要填寫一個變量在dockerfile與在bash VAR = $(日期)解析一個變量與在DockerFile

EDIT命令

等的結果1

日期是一個例子。 在我的情況我使用FROM phusion/baseimage:0.9.17所以我想在每個建築使用最後的版本,所以我使用這個 curl -v --silent api.github.com/repos/phusion/baseimage-docker/tags 2>&1 | grep -oh 'rel-.*",' | head -1 | sed 's/",//' | sed 's/rel-//' ==> 0.9.17。 但我不知道我是如何與dockerfile解析它在var來達到這個結果

ENV verbaseimage=curl... 
FROM phusion/baseimage:$verbaseimage 

結果

在我的使用情況

FROM phusion/baseimage:latest 

但問題仍然沒有解決其他案例

回答

2

我有同樣的問題,找到辦法通過dockerfile使用運行命令來設置環境變量的函數的結果。

例如,我需要在不改變爲將設置SECRET_KEY_BASE爲Rails應用程序只有一次,當我運行:

docker run -e SECRET_KEY_BASE="$(openssl rand -hex 64)" 

相反,我寫信給Dockerfile字符串,如:

RUN bash -l -c 'echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" >> /etc/bash.bashrc' 

和我的ENV即使在bash登錄後,也可以從root獲得。 或可能

RUN /bin/bash -l -c 'echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" > /etc/profile.d/docker_init.sh' 

那麼變量可以在CMD和入口點命令

泊塢高速緩存作爲層且僅當您之前改變一些字符串改變。

您也可以嘗試different ways設置環境變量。

3

舊的解決方法是mentioned here (issue 2637: Feature request: expand Dockerfile ENV $VARIABLES in WORKDIR)

我曾使用過的一項工作是在我的上下文中有一個名爲「build-env」的文件。我所做的是將其源碼並在相同的RUN步驟中運行我所需的命令。因此,例如:

build-env

VERSION=stable 

Dockerfile

FROM radial/axle-base:latest 
ADD build-env /build-env 
RUN source build-env && mkdir /$VERSION 
RUN ls/

date,這也許不是你想要的那樣精確。

其他解決方法在issue 2022 "Dockerfile with variable interpolation"


在泊塢窗1.9(2015年10月結束),你將有 「support for build-time environment variables to the 'build' API (PR 9176)」 和 「Support for passing build-time variables in build context (PR 15182)」。

docker build --build-arg=[]: Set build-time variables 

您可以在Dockerfile中使用ENV指令來定義變量值。這些值堅持在建成的形象。但是,往往持久不是你想要的。用戶想要根據他們在哪個主機上構建圖像來指定不同的變量。

一個很好的例子是用於拉取中間文件的http_proxy或源版本。該ARG指令讓Dockerfile作者定義用戶可在編譯時使用---build-arg標誌設置值:

$ docker build --build-arg HTTP_PROXY=http://10.20.30.2:1234 . 

此標誌允許你傳遞就像普通的環境變量訪問的編譯時變量在DockerfileRUN指令中。
另外,這些值不在中間或最終圖像等ENV值做仍然存在。


,所以我想在每棟樓使用的最後一個版本,所以如果你想使用該圖像的最後一個版本我用這個

curl -v --silent api.github.com/repos/phusion/baseimage-docker/tags 2>&1 | grep -oh 'rel-.*",' | head -1 | sed 's/",//' | sed 's/rel-//' ==> 0.9.17. 

,所有你需要do是使用標籤'latest'與FROM directive

FROM phusion/baseimage:latest 

也是「The misunderstood Docker tag: latest」見:它並不總是引用實際的最新版本,但在這種情況下,它應該工作。

如果你真的想使用curl |解析選項,可以使用它來生成Dockerfile用正確的值(如在處理,生成正確的文件模板)。
不要試圖直接在Dockerfile中使用它。

+0

日期是一個例子, 在我的情況我使用FROM phusion/baseimage:0.9.17所以我想在每個建築使用最後的版本,所以我用這個curl -v --silent https://api.github。 com/repos/phusion/baseimage-docker/tags 2>&1 | grep -oh'rel - 。*「,'| head -1 | sed's /」,//'| sed's/rel - //'==> 0.9.17。但我不知道我怎麼分析它與dockerfile – SilentT

+0

@SilentT尼斯VAR:我之前推薦的PHUSION/baseimage爲PID 1子進程收穫期(http://stackoverflow.com/a/33119321/6309)。你能用更多的細節來編輯你的問題嗎? – VonC

+1

@SilentT在這種情況下,你不需要解析任何東西:只需使用最新的標籤:我已經相應地編輯了我的答案。 – VonC