如何使用shell脚本在dockerfile中设置环境variables的dynamic值

我的情况如下

  • 我需要添加“项目”文件夹docker容器为生产build设,但对于开发生成我想将本地卷装载到容器的项目文件夹,例如。 ADD project /var/www/html/project
    没有发展(我可以在开发中复制一个虚拟文件夹)

    如果我将整个项目文件夹复制到开发中的容器中,那么项目文件夹中的任何更改都将使add命令之后的dockercaching器无效。 开发Docker镜像需要时间。

  • 我想为这两个环境使用相同的docker文件

  • 为了达到这个目的,我在docker文件中使用了ADD $PROJECT_DIR /var/www/html/project ,其中$ PROJECT_DIR是环境variables

  • 在像ENV PROJECT_DIR projectENV CONFIG_FILE_PATH dummy-folderdocker文件中设置环境variables将正确的文件ENV CONFIG_FILE_PATH dummy-folder添加到容器,但它需要我每次更改docker文件。

  • build造docker图像时,我也可以传递“build-arg”参数

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

    由于variablesBUILD_TYPE和PROJECT_DIR是相关的,我想根据BUILD_TYPE设置CONFIG_FILE_PATHvariables。 这将防止我忘记更改一个参数的情况。

  • 为了设置我写下的脚本“set_config_path.sh”的PROJECT_DIRvariables,

     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脚本可以访问BUILD_TYPEvariables,但PROJECT_DIR不反映在docker文件中

  • 在本地机器的terminal上运行set_project_folder.sh时,PROJECT_DIRvariables被改变了,但是它不能和dockerfile一起工作

有无论如何,我们可以从子shell脚本更改环境variables,例如上面的问题中的“set_config_path.sh”?

如果可能的话,它可以在许多用例中使用,使dockerbuild设dynamic

我在这里做错了什么?
要么
有没有另外一个好方法来达到这个目的?

你可以使用下面的东西

 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= 

这是因为构build参数不作为环境variables持久化。 如果你想在图像中保存这些variables,那么你需要在下面添加

 ENV BUILD_TYPE=$BUILD_TYPE CONFIG_FILE_PATH=$CONFIG_FILE_PATH 

现在docker运行也将输出

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