我的方案如下
我需要将“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 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变量。这样可以防止我忘记更改一个参数。
用于设置我在脚本“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文件中
无论如何我们可以在上面的问题中从子shell脚本中更改环境变量,例如“set_config_path.sh”吗?
如果可能,可以在许多用例中使用它来使docker构建动态
我在这里做错了吗?
OR
还有另一种实现这一目标的好方法吗?
答案 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