我们大量使用docker进行集成测试并缩短测试环境的设置时间,我们希望在一定程度上创建已经包含测试数据的图像。
对于某些服务,我们依赖公共docker镜像来定义存储数据的卷。
我观察到,在构建期间,docker不会保存存储在这些卷安装(由基本映像定义)中的数据。关于此问题也存在问题,例如this,this或this issue。
现在考虑到docker的工作方式,我想知道解决这个问题的好方法是什么?
This question这里描述了如何使用图像中的数据预先填充卷 - 这与我想要实现的内容相反。
目前我正在设置图像,并在构建结束时将预先填充的数据从卷装置移动到另一个目录。在容器启动时,我将每个子文件夹链接回卷装入。但这有点难看,因为我必须单独链接每个子文件夹,因为父文件夹是卷挂载而无法链接。
有更好的方法吗?甚至有一个"官员" docker的方式来实现这个目标?
答案 0 :(得分:0)
您可以创建一个新的docker镜像来存储已构建到其中的测试用例和测试数据。这可以使用或不使用您的测试应用程序来构建。
稍后您可以决定是否要将其作为单独的容器运行以测试临时内容或作为多阶段测试图像创建的一部分,例如:
FROM alpine:latest
# Start from your vendor image
# Copy your test-data to your container
COPY test-data1 /usr/test-data/case1
COPY test-data2 /usr/test-data/case2
# Add what you need to execute..
CMD [./execute-test]
然后您可以run
容器甚至没有任何卷,并根据需要发出结果,或者您可以使用multi-stage builds,在一个图像中捕获测试数据并构建您的测试应用程序它有两个阶段:
FROM mytest-data:latest # Image created as the previous step
FROM mytest-app:latest # Your test-application
WORKDIR /usr/test-data
RUN ./test-app # to execute and capture test results in the build phase
无论哪种方式,我建议将自定义图片上传到您自己的图片寄存中,例如AWS ECR或Artifactory等。
答案 1 :(得分:0)
您的评论"对于某些服务,我们依赖公共泊坞窗图像来定义存储数据的卷。"似乎与以下问题有关:不可能" undeclare"一卷。在将生产映像接收到测试设置时,我也遇到了这个问题 - 最近我创建了一个可以帮助解决这种情况的解决方法。 (docker-copyedit)。