使用DockerFile中的命令结果解析变量

时间:2015-10-18 17:53:10

标签: docker dockerfile

我需要使用命令的结果填充dockerfile中的变量

就像bash var = $(date)

一样

编辑1

日期就是一个例子。 在我的情况下,我使用public static void swapPairs(int[] a){ int len=a.length; if(len%2 ==0){ for(int i=0; i<len; i=i+2){ int c=a[i]+a[i+1]; a[i]=c-a[i]; a[i+1]=c-a[i+1]; } } if(len%2 !=0){ for(int j=0; j<len-1; j=j+2){ int c=a[j]+a[j+1]; a[j]=c-a[j]; a[j+1]=c-a[j+1]; } a[len-1]=a[len-1]; } } public static void printArray(int[] a){ int len=a.length; for(int i=0;i<len;i++) System.out.print(a[i]+" "); } 所以我想在每个建筑物使用最后一个版本所以我使用它 FROM phusion/baseimage:0.9.17 ==&gt; 0.9.17。 但我不知道如何使用dockerfile为此结果解析它

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

RESULT

在我的用例中

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

但其他案例

的问题仍未得到解决

4 个答案:

答案 0 :(得分: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"

在docker 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 .
  

此标志允许您在RUN的{​​{1}}指令中传递像常规环境变量一样访问的构建时变量。
  此外,这些值不会像Dockerfile值那样在中间或最终图像中保留。

  

所以我想在每个建筑物使用最后一个版本,所以我使用这个

ENV

如果您想使用该图片的最新版本,您只需使用FROM directive标记“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. ”:

latest

另请参阅“The misunderstood Docker tag: latest”:它并不总是引用实际的最新版本,但在这种情况下,它应该可以正常工作。

如果您真的想使用curl | parse选项,请使用它来生成具有正确值的Dockerfile(如处理模板以生成正确的文件)。
不要尝试直接在Dockerfile中使用它。

答案 1 :(得分:2)

我有同样的问题,并找到了通过在dockerfile中使用RUN命令将环境变量设置为函数的方法。

例如,我需要为Rails应用程序设置SECRET_KEY_BASE一次而不会像我运行时那样进行更改:

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'
即使在bash登录后,

和我的env变量也可从root获得。 或者可能是

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

然后它在CMD和ENTRYPOINT命令中可用

Docker将其缓存为图层,只有在您更改之前的某些字符串时才会更改。

您也可以尝试different ways设置环境变量。

答案 2 :(得分:1)

我想从Dockerfile中的计算中设置ENVLABEL变量,例如使一些计算的安装选项在docker inspect中可见。

似乎没有任何办法做到这一点,this issue暗示这是一种安全设计选择。

Dockerfile可以将ENV变量设置为$X${X:-default}${X:+substitute},其中$X必须是另一个ENV或{ {1}}变量。

单个ARG命令可以设置和使用shell变量,但是当该容器层关闭时,RUN命令的结尾就会消失。

RUN命令可以将计算出的数据写入文件,但是即使文件是RUN,Dockerfile仍无法将数据获取到ENVLABEL中。 (文件内容当然可以由容器中运行的代码使用。)

该构建至少可以~/.bashrc来将选择记录到构建日志中-除非该步骤来自构建缓存,在这种情况下,RUN echo $X步骤不会运行。

如果有解决办法,请纠正我。

答案 3 :(得分:-2)

部分与问题相关。如果以后想要使用某个命令的结果,可以在单个RUN语句中进行如下操作:

RUN CUR_DIR=`pwd` && \
    echo $CUR_DIR