2016-12-24 81 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