我正在为我的大学创建自动测试服务。我需要获取学生代码,将其放入项目目录中,然后运行测试。
这需要以可扩展的方式针对多种不同的语言来完成。
我的最初计划:
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也很陌生-有更好的方法来做到这一点吗?
欢呼
答案 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工具链和关联的头文件,因此,当您获得一个看似巨大的图像时,所有这些都来自基础图像中的层因此可以在各个版本之间共享(它并没有占用您想像的那么大的空间)。