如何使用shell脚本

时间:2017-10-21 19:04:32

标签: shell docker environment-variables dockerfile

我的方案如下

  • 我需要将“project”文件夹添加到docker容器中进行生产构建,但是对于开发构建我想将本地卷挂载到容器的项目文件夹 例如。 ADD project /var/www/html/project正在制作中  没有开发(我可以在开发中复制虚拟文件夹)

    如果我将整个项目文件夹复制到开发中的容器,那么项目文件夹中的任何更改都将使add命令后的图层的docker缓存无效。在开发中构建docker镜像需要时间。

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

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

  • 在像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变量。这样可以防止我忘记更改一个参数。

  • 用于设置我在脚本“set_config_path.sh”后面写的PROJECT_DIR变量

    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_TYPE变量,但PROJECT_DIR不会反映在docker文件中

  • 在本地计算机的终端中运行set_project_folder.sh时,PROJECT_DIR变量已更改,但它不能与dockerfile一起使用

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

如果可能,可以在许多用例中使用它来使docker构建动态

我在这里做错了吗? OR
还有另一种实现这一目标的好方法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容

int[] array = { 0, 0, 1, 1, 2 };
var result = array.GroupBy(a => a)
                  .Where(o => (o.Count() % 2 == 1))
                  .Select(o => o.Key);
string resultString = string.Join(", ", result.ToArray());
Console.WriteLine(resultString);

输出就像

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=

现在,docker run也将输出

ENV BUILD_TYPE=$BUILD_TYPE CONFIG_FILE_PATH=$CONFIG_FILE_PATH