如何使用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 project
或ENV CONFIG_FILE_PATH dummy-folder
docker文件中设置环境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