Hum*_*ler 7 c++ docker dockerfile
编写 docker 文件以针对同一编译器的许多不同版本进行构建的惯用方法是什么?
我有一个项目,它针对不同编译器的各种版本进行测试,就像gccCIclang工作的一部分一样。在某些时候,CI 任务的代理被更新/更改,导致新的作业失败——因此我开始研究对这些构建进行 docker 化,以尝试保证更好的可靠性和稳定性。
然而,我很难理解什么是正确且惯用的方法来生成这样的构建图像,而不会导致层引起的大量重复。
例如,假设我想使用以下工具集进行构建:
gcc4.8、4.9、5.1、...(各种版本)cmake(最新的)ninja-build我可以写这样的东西:
# syntax=docker/dockerfile:1.3-labs
# Parameterizing here possible, but would cause bloat from duplicated
# layers defined after this
FROM gcc:4.8
ENV DEBIAN_FRONTEND noninteractive
# Set the work directory
WORKDIR /home/dev
COPY . /home/dev/
# Install tools (cmake, ninja, etc)
# this will cause bloat if the FROM layer changes
RUN <<EOF
apt update
apt install -y cmake ninja-build
rm -rf /var/lib/apt/lists/*
EOF
# Default command is to use CMak
CMD ["cmake"]
Run Code Online (Sandbox Code Playgroud)
ninja-build但是,诸如和 等工具的安装cmake发生在基本映像之后,每个编译器版本都会有所不同。由于这些层是基于不同的父层构建的,因此(据我所知)这将导致所使用的每个不同编译器版本的层重复。
假设避免这种重复的一种替代方法是使用较小的基础映像,例如alpine单独安装编译器。可以首先安装这些工具,以便各层保持共享,并且只有编译器作为最后一层进行更改 - 但这也带来了其自身的困难,因为通常情况下某些编译器版本可能需要自定义步骤,例如安装某些密钥环。
完成此任务的惯用方法是什么?这通常是通过多个 docker 文件还是通过带有参数的单个 docker 文件来完成?任何例子将不胜感激。
我会将准备编译器和进行计算的部分分开,这样源就不会成为 docker 容器的一部分。
准备编译器
为了准备编译器,我将采用 ARG 方法,但不将数据复制到容器中。如果您想在拥有足够资源的情况下快速重试,您可以同时启动多个实例。
ARG COMPILER=gcc:4.8
FROM ${COMPILER}
ENV DEBIAN_FRONTEND noninteractive
# Install tools (cmake, ninja, etc)
# this will cause bloat if the FROM layer changes
RUN <<EOF
apt update
apt install -y cmake ninja-build
rm -rf /var/lib/apt/lists/*
EOF
# Set the work directory
VOLUME /src
WORKDIR /src
CMD ["cmake"]
Run Code Online (Sandbox Code Playgroud)
建造它
在这里你有几个选择。您可以准备一个包含源的卷,也可以将绑定安装与 docker exec 一起使用,如下所示:
#bash style
for compiler in gcc:4.9 gcc:4.8 gcc:5.1
do
docker build -t mytag-${compiler} --build-arg COMPILER=${compiler} .
# place to clean the target folder
docker run -v $(pwd)/src:/src mytag-${compiler}
done
Run Code Online (Sandbox Code Playgroud)
而且因为源不是 docker 镜像的一部分,所以不会有臃肿的情况。您还可以有两个安装,一个用于只读源树,另一个用于输出文件。
注意:如果删除 CMake 命令,您还可以并行启动 docker 容器并使用 docker exec 启动构建。这样做的缺点是您必须处理源构建以避免输出文件夹发生冲突。
| 归档时间: |
|
| 查看次数: |
974 次 |
| 最近记录: |