2016-12-24 82 views
4

我可以在Dockerfile中使用ENV定义“静态”环境变量,但是可以在构建时将某个值传递给此变量吗?我试图这样的事情,这不工作:如何将环境变量导出到泊坞窗图像?

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 

回答

4

要在构建时传递一个值,可使用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中没有任何东西可以从run命令的输出中更新,输出不会被解析,只会保存生成的文件系统。为此,我认为您最好在运行命令中编写映像的路径并从/ etc/profile或自定义入口点脚本读入。这取决于你想如何启动你的容器和基础图像。

+0

我的理解是否正确:您使用''ARG''和''--build-arg''的''FOOPATH'与''RUN''命令完全无关?那对我来说这不是一个解决方案。我想导出在''RUN''中发生的事情的结果,这在事先并不完全知道。 – Jellby

+0

确实,我错过了你正在尝试使用run命令的输出。我已经更新了我的答案。 – BMitch