使用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 .
该标志允许您在
Dockerfile
的RUN
指令中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中使用它。