在Docker容器内进行编译,而无需使用巨大的容器

时间:2018-10-12 06:19:06

标签: docker memory continuous-integration size

我正在为我的大学创建自动测试服务。我需要获取学生代码,将其放入项目目录中,然后运行测试。

这需要以可扩展的方式针对多种不同的语言来完成。

我的最初计划:

  • 每种语言都有一个“基本映像”(即在let newDob = (d.getFullYear()) + '-' + (d.getMonth() > 8 ? (+d.getMonth() + 1).toString() : '0' + (+d.getMonth() + 1).toString()) + '-' + (d.getDate() > 9 ? d.getDate() : '0' + d.getDate()) 上安装语言运行时)
  • 获取用户文件和预制项目结构
  • 将用户文件放入项目中的正确位置
  • 构建扩展基础图像的项目图像
  • 运行容器。它将编译项目并运行测试。
  • 将测试结果保存到数据库,停止并删除图像
  • 每次提交时重复冲洗

手动测试时,图像大小非常大!几乎为1.5GB!我正在为一种语言安装运行时,并且正在用Hello World进行测试-因此项目也不大。

这个“有效”,但感觉效率很低。我对Docker也很陌生-有更好的方法来做到这一点吗?

欢呼

1 个答案:

答案 0 :(得分:1)

在这个特定的应用程序中,我可能会在容器中编译该程序,而不是在其中构建映像(因为您要立即将其丢弃,并且编译和测试是重要的部分,并且通常,您之后就不需要构建的程序了。

如果您假设输入文件以某种方式进入了容器,那么您可以编写一个脚本来进行构建和测试:

#!/bin/sh
cd /project/src/student
tar xzf "/app/$1"
cd ../..
make
...
curl ???  # send the test results somewhere

然后,您的Dockerfile只是将其构建为映像,其中没有任何特定的学生代码

FROM buildpack-deps:stretch
RUN apt-get update && apt-get install ...
RUN adduser user
COPY build_and_test.sh /usr/local/bin
USER user
ADD project-structure.tar.gz /project

然后,当您实际运行它时,可以使用docker run -v选项注入已提交的代码。

docker run --rm -v $HOME/submissions:/app theimage \
  build_and_test.sh student_name.tar.gz

在原始解决方案中,请注意,最大的事情可能是语言运行时,C工具链和关联的头文件,因此,当您获得一个看似巨大的图像时,所有这些都来自基础图像中的层因此可以在各个版本之间共享(它并没有占用您想像的那么大的空间)。