使用测试容器作为 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创建镜像

测试容器:忽略来自 Dockerfile 的父“EXPOSE”指令

dockerfile创建镜像

dockerfile创建镜像

47-Docker-Dockerfile镜像创建自动化生产案例

5.Dockerfile