使用测试容器作为 Dockerfile 的一部分运行测试
Posted
技术标签:
【中文标题】使用测试容器作为 Dockerfile 的一部分运行测试【英文标题】:Running test with testcontainers as part of a Dockerfile 【发布时间】:2020-07-15 20:28:42 【问题描述】:我的 dockerfile 看起来像这样:
FROM maven:3-jdk-11-slim
COPY pom.xml .
COPY src src
RUN mvn clean install
这意味着构建的一部分是单元测试的执行。一些单元测试使用测试容器。在我的本地机器上运行 mvn clean install
工作正常,但运行 docker build . -t my-app
却不行,因为测试容器无法启动。
(...)
15:54:38.793 [ducttape-0] DEBUG org.testcontainers.dockerclient.DockerClientProviderStrategy - Pinging docker daemon...
15:54:38.794 [ducttape-0] DEBUG com.github.dockerjava.core.command.AbstrDockerCmd - Cmd: org.testcontainers.dockerclient.transport.okhttp.OkHttpDockerCmdExecFactory$1@355cb260
15:54:39.301 [ducttape-0] DEBUG org.testcontainers.dockerclient.DockerClientProviderStrategy - Pinging docker daemon...
15:54:39.301 [ducttape-0] DEBUG com.github.dockerjava.core.command.AbstrDockerCmd - Cmd: org.testcontainers.dockerclient.transport.okhttp.OkHttpDockerCmdExecFactory$1@1c1a1359
15:54:39.469 [main] ERROR org.testcontainers.dockerclient.EnvironmentAndSystemPropertyClientProviderStrategy - ping failed with configuration Environment variables, system properties and defaults. Resolved dockerHost=unix:///var/run/docker.sock due to org.rnorth.ducttape.TimeoutException: Timeout waiting for result with exception
org.rnorth.ducttape.TimeoutException: Timeout waiting for result with exception
(...)
我已经看到使用工作测试容器运行 docker run
的示例,但是如何使我的 docker build
工作?
非常感谢您的帮助。
【问题讨论】:
所以您在 docker 容器中运行构建并在该容器中运行 Testcontainers ?这意味着 Docker 中的 Docker ...?为什么在容器内运行构建有什么特殊要求? 我使用多阶段 docker 文件来构建项目。在容器内构建项目,以便能够在任何环境中进行干净的构建。因此。从 maven/java-container 内部控制主机的 Docker 引擎很好。在 Docker 中使用 Docker(在 maven/java-container 中有一个单独的 Docker 引擎)也可以。只要我让它工作...... 【参考方案1】:供将来参考:我相信这根本不可能。
docker run
允许您使用-v /var/run/docker.sock:/var/run/docker.sock
挂载 Docker 套接字(从而访问主机的 Docker 守护进程)。
docker build
不支持这样的论点。
我的解决方法是将我的 Dockerfile 修改为
RUN mvn clean install -Dmaven.test.skip=true
并单独运行单元测试。
【讨论】:
以上是关于使用测试容器作为 Dockerfile 的一部分运行测试的主要内容,如果未能解决你的问题,请参考以下文章
测试容器:忽略来自 Dockerfile 的父“EXPOSE”指令