2017-10-21 180 views
0

我的方案是遵循如何使用shell腳本設置在dockerfile環境變量動態值

  • 我需要添加「項目」文件夾泊塢窗容器的生產版本,但對於開發版本我想掛載投影容器的本地容量文件夾 例如。 ADD project /var/www/html/project生產
    發展什麼,如果我整個項目文件夾複製到容器的發展則項目文件夾中的任何改變都會add命令後層的泊塢窗廢除高速(我可以在開發複製的虛擬文件夾)

    。開發Docker鏡像需要時間。

  • 我想用同樣的搬運工文件兩個環境

  • 爲了實現我在泊塢窗文件,其中$ PROJECT_DIR是環境變量

  • 設置在泊塢窗文件中的環境變量像ENV PROJECT_DIR project使用ADD $PROJECT_DIR /var/www/html/projectENV CONFIG_FILE_PATH dummy-folder將正確的文件夾添加到容器,但它需要我每次更改docker文件。

  • 建設搬運工圖像像

    docker build -t myproject --build-arg "BUILD_TYPE=PROD" --build-arg "PROJECT_DIR=project" . 
    

    爲變量BUILD_TYPE和PROJECT_DIR相關時,我也可以通過「集結ARG」參數,我想設置基於BUILD_TYPE CONFIG_FILE_PATH變量。這將防止我忘記更改一個參數的情況。

  • 對於設置我寫下面的腳本 「set_config_path.sh」

    if [ $BUILD_TYPE="PROD" ]; then 
        PROJECT_DIR="project"; 
    else 
        PROJECT_DIR="dummy-folder"; 
    fi 
    
  • 我然後運行dockerfile腳本使用

    RUN . /root/set_project_folder.sh 
    

    這樣做,set_project_folder.sh可以編寫腳本的PROJECT_DIR變量訪問BUILD_TYPE變量,但PROJECT_DIR未在Docker文件中反映出來

  • 以m爲單位運行set_project_folder.sh Ÿ本地機器的終端,該PROJECT_DIR變量發生變化,但它不與dockerfile

工作反正是有,我們可以環境變量從子shell腳本e.g「set_config_path.sh」在上述問題的變化?

如果可能的話,它可以在許多用例用來做搬運工建立動態

難道我做錯了什麼嗎?

是否有另一個很好的方法來實現這一目標?

回答

0

您可以使用類似下面

FROM alpine 
ARG BUILD_TYPE=prod 
ARG CONFIG_FILE_PATH=config-$BUILD_TYPE.yml 
RUN echo "BUILD_TYPE=$BUILD_TYPE CONFIG_FILE_PATH=$CONFIG_FILE_PATH" 
CMD echo "BUILD_TYPE=$BUILD_TYPE CONFIG_FILE_PATH=$CONFIG_FILE_PATH" 

輸出會像

Step 4/4 : RUN echo "BUILD_TYPE=$BUILD_TYPE CONFIG_FILE_PATH=$CONFIG_FILE_PATH" 
---> Running in b5de774d9ebe 
BUILD_TYPE=prod CONFIG_FILE_PATH=config-prod.yml 

但是,如果你運行圖像

$ docker run 9df23a126bb1 
BUILD_TYPE= CONFIG_FILE_PATH= 

這是因爲建立ARG遊戲不堅持爲環境變量。如果你想堅持的圖像中,這些變量也,那麼你需要添加下面

ENV BUILD_TYPE=$BUILD_TYPE CONFIG_FILE_PATH=$CONFIG_FILE_PATH 

現在泊塢窗運行也將輸出

$ docker run c250a9d1d109 
BUILD_TYPE=prod CONFIG_FILE_PATH=config-prod.yml 
+0

謝謝你好,你的解決方案將爲條件下工作,我把上這個問題,對不起,我忘了提及其他條件。我也想使用「BUILD_TYPE」變量來複制生產版本的一些文件夾,但不能用於開發版本。我會更新我的問題也包括這一點 –