2015-10-18 34 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