【发布时间】:2018-04-02 16:18:49
【问题描述】:
我的场景如下
-
我需要将“项目”文件夹添加到 docker 容器以进行生产构建,但对于开发构建,我想将本地卷挂载到容器的项目文件夹 例如。
ADD project /var/www/html/project生产中
开发中什么都没有(我可以在开发中复制一个虚拟文件夹)如果我将整个项目文件夹复制到开发中的容器,那么项目文件夹中的任何更改都会在添加命令之后使层的 docker 缓存无效。在开发中构建 docker 镜像需要时间。
我想在两个环境中使用相同的 docker 文件
为了实现这一点,我在 docker 文件中使用了
ADD $PROJECT_DIR /var/www/html/project,其中 $PROJECT_DIR 是环境变量在 docker 文件中设置环境变量,如
ENV PROJECT_DIR project或ENV CONFIG_FILE_PATH dummy-folder会将正确的文件夹添加到容器中,但每次都需要我更改 docker 文件。-
我也可以在构建docker镜像时传递“build-arg”参数
docker build -t myproject --build-arg "BUILD_TYPE=PROD" --build-arg "PROJECT_DIR=project" .由于变量 BUILD_TYPE 和 PROJECT_DIR 是相关的,我想根据 BUILD_TYPE 设置 CONFIG_FILE_PATH 变量。这将防止我忘记更改一个参数。
-
为了设置 PROJECT_DIR 变量,我编写了以下脚本“set_config_path.sh”
if [ $BUILD_TYPE="PROD" ]; then PROJECT_DIR="project"; else PROJECT_DIR="dummy-folder"; fi -
然后我使用 dockerfile 在 dockerfile 中运行脚本
RUN . /root/set_project_folder.sh这样做,set_project_folder.sh 脚本可以访问 BUILD_TYPE 变量,但 PROJECT_DIR 不会反映在 docker 文件中
- 在我的本地计算机终端中运行 set_project_folder.sh 时,PROJECT_DIR 变量已更改,但它不适用于 dockerfile
我们是否可以从 subshell 脚本更改环境变量,例如上述问题中的“set_config_path.sh”?
如果可能的话,它可以在许多用例中使用,使 docker build 动态
我在这里做错了吗?
或
有没有其他好方法来实现这一点?
【问题讨论】:
标签: shell docker environment-variables dockerfile