如何将环境变量导出到Docker镜像?

11
我可以使用ENV在Dockerfile中定义“静态”环境变量,但是是否可以在构建时向此变量传递某些值?我正在尝试像这样的东西,但不起作用:
FROM phusion/baseimage

RUN mkdir -p /foo/2016/bin && \
    FOOPATH=`ls -d /foo/20*/bin` && \
    export FOOPATH

ENV PATH $PATH:$FOOPATH
当然,在实际使用中,我将运行/解压缩一些创建目录的东西,其名称会随不同版本、日期等而改变,并且我希望避免每次目录名称更改时修改Dockerfile。


编辑:由于似乎不可能,到目前为止最好的解决方法是使用符号链接:

FROM phusion/baseimage

RUN mkdir -p /foo/2016/bin && \
    FOOPATH=`ls -d /foo/20*/bin` && \
    ln -s $FOOPATH /mypath

ENV PATH $PATH:/mypath
1个回答

5

要在构建时传递值,请使用ARG

FROM phusion/baseimage

RUN mkdir -p /foo/2016/bin && \
    FOOPATH=`ls -d /foo/20*/bin` && \
    export FOOPATH

ARG FOOPATH
ENV PATH $PATH:${FOOPATH}

然后您可以运行docker build --build-arg FOOPATH=/dir -t myimage .进行构建。
编辑:根据您的评论,我上面的答案无法解决您的问题。无法从运行命令的输出中更新Dockerfile中的任何内容,只保存结果文件系统而不进行解析。因此,在运行命令中,最好写入图像路径并从/etc/profile或自定义入口点脚本中读取。这取决于您如何启动容器和基础映像。

我理解得对吗?你在使用“ARG”和“--build-arg”时所用的“FOOPATH”与“RUN”命令内部的路径完全无关?那对我来说不是一个解决方案。我想要导出在“RUN”中发生的某些事情的结果,但我事先并不完全知道它是什么。 - Jellby
确实,我错过了您试图使用运行命令的输出。我已经更新了我的答案。 - BMitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接