使用DockerFile中的命令的结果parsingvariables

我需要用一个命令的结果在dockerfile中填充一个variables

像在bash中一样var = $(date)

编辑1

date是一个例子。 在我的情况我使用FROM phusion/baseimage:0.9.17所以我想在每个build筑使用最后的版本,所以我使用这个curl -v --silent api.github.com/repos/phusion/baseimage-docker/tags 2>&1 | grep -oh 'rel-.*",' | head -1 | sed 's/",//' | sed 's/rel-//' curl -v --silent api.github.com/repos/phusion/baseimage-docker/tags 2>&1 | grep -oh 'rel-.*",' | head -1 | sed 's/",//' | sed 's/rel-//' 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。 但我不知道如何parsing它在与dockerfile var这个结果

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

结果

在我的用例

 FROM phusion/baseimage:latest 

但是其他情况下这个问题还没有解决

我有同样的问题,并find了方法来设置环境variables作为function的结果使用RUN命令在dockerfile。

例如,我需要设置SECRET_KEY_BASE的Rails应用程序只有一次,而不会改变,因为当我运行:

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

相反,我写入Dockerfilestring,如:

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

和我的envvariables可以从根,即使在bashlogin后。 或者可能

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

那么它在CMD和ENTRYPOINT命令中可用

Dockercaching它作为图层,只有改变它之前的一些string才更改。

你也可以尝试不同的方式来设置环境variables。

旧的解决方法在此处提到(问题2637:function请求:展开WORKDIR Dockerfile ENV $VARIABLES ) :

我使用过的一个工作是在我的上下文中build-env一个名为“ 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 ,这可能不是你想要的那么精确。

其他解决方法是在2022“可变插值Dockerfile”的问题 。


在Docker 1.9(2015年10月底)中,您将“ 支持”build“API(PR 9176)和” 支持在构build上下文中传递构build时variables(PR 15182) “的构build时环境variables 。

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

您可以在Dockerfile中使用ENV指令来定义variables值。 这些值坚持在build成的形象。 但是,往往坚持不是你想要的。 用户想要根据他们在哪个主机上构build图像来指定不同的variables。

一个很好的例子是用于拉取中间文件的http_proxy或源代码版本。 ARG指令允许Dockerfile作者定义用户可以在构build时使用---build-arg标志设置的值:

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

该标志允许您在DockerfileRUN指令中Dockerfile像常规环境variables一样访问的构build时variables。
而且,这些值不会像ENV值一样保留在中间或最终图像中。


所以我想在每个build筑使用最后的版本,所以我用这个

 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. 

如果您想使用该图像的最后一个版本,则只需在FROM指令中使用“ latest ”标签即可:

 FROM phusion/baseimage:latest 

另请参阅“ 误解的Docker标记: latest ”:它并不总是引用实际的最新版本,但在这种情况下,它应该工作。

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