我需要使用命令的结果填充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
但其他案例
的问题仍未得到解决答案 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中的计算中设置ENV
或LABEL
变量,例如使一些计算的安装选项在docker inspect
中可见。
似乎没有任何办法做到这一点,,this issue暗示这是一种安全设计选择。
Dockerfile可以将ENV
变量设置为$X
,${X:-default}
或${X:+substitute}
,其中$X
必须是另一个ENV
或{ {1}}变量。
单个ARG
命令可以设置和使用shell变量,但是当该容器层关闭时,RUN
命令的结尾就会消失。
RUN
命令可以将计算出的数据写入文件,但是即使文件是RUN
,Dockerfile仍无法将数据获取到ENV
或LABEL
中。 (文件内容当然可以由容器中运行的代码使用。)
该构建至少可以~/.bashrc
来将选择记录到构建日志中-除非该步骤来自构建缓存,在这种情况下,RUN echo $X
步骤不会运行。
如果有解决办法,请纠正我。
答案 3 :(得分:-2)
部分与问题相关。如果以后想要使用某个命令的结果,可以在单个RUN
语句中进行如下操作:
RUN CUR_DIR=`pwd` && \
echo $CUR_DIR