2017-10-21 827 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”变量来复制生产版本的一些文件夹,但不能用于开发版本。我会更新我的问题也包括这一点 –

相关问题