【问题标题】:How to set dynamic value in environment variable in dockerfile using shell script如何使用shell脚本在dockerfile中的环境变量中设置动态值
【发布时间】: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 projectENV 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

我们是否可以从 subshel​​l 脚本更改环境变量,例如上述问题中的“set_config_path.sh”?

如果可能的话,它可以在许多用例中使用,使 docker build 动态

我在这里做错了吗?

有没有其他好方法来实现这一点?

【问题讨论】:

    标签: shell docker environment-variables dockerfile


    【解决方案1】:

    你可以使用类似下面的东西

    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=
    

    这是因为构建参数没有作为环境变量持久化。如果您还想在图像中保留这些变量,则需要在下面添加

    ENV BUILD_TYPE=$BUILD_TYPE CONFIG_FILE_PATH=$CONFIG_FILE_PATH
    

    现在 docker run 也会输出

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

    【讨论】:

    • 您好,谢谢,您的解决方案适用于我提出问题的条件,抱歉我忘了提到其他条件。我还想使用“BUILD_TYPE”变量来复制一些文件夹用于生产构建,而不是用于开发构建。我将更新我的问题以包括该问题
    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2015-01-03
    • 1970-01-01
    相关资源
    最近更新 更多