【问题标题】:Testcontainers ; Running @Testcontainers Tests inside docker [Running Docker inside Docker]测试容器;在 docker 中运行 @Testcontainers 测试 [在 Docker 中运行 Docker]
【发布时间】:2020-04-22 02:13:37
【问题描述】:

如何在 docker 容器中运行基于 @Testcontainers 的测试用例?

我有一个简单的 Spring Boot 应用程序,它具有使用 Testcontainers 与容器交互的集成测试(组件级别)。测试用例从外部容器(本地机器)破坏得很好。

我们在容器中运行所有内容,并且构建在 docker jenkins 映像上运行。 Docker 文件正在创建 jar,然后是图像。 @Testcontainers 找不到安装的 docker。 下面是我的码头文件。

FROM maven:3.6-jdk-11-openj9
VOLUME ["/var/run/docker.sock"]
RUN apt-get update
RUN apt-get -y install docker.io
COPY . /usr/src/app
WORKDIR /usr/src/app
RUN mvn -Dmaven.repo.local=/root/m2 --batch-mode -f pom.xml clean package
EXPOSE 8080
CMD ["/bin/bash"]

运行构建时出现以下错误

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

处理这种情况的最佳方法是什么?我想在 mvn 构建阶段使用 docker 文件运行我的组件级集成测试。

以下参考对我没有帮助。 https://www.testcontainers.org/supported_docker_environment/continuous_integration/dind_patterns/

【问题讨论】:

  • 这应该如何工作?这意味着您需要在 docker 容器中使用 docker。你不应该在这种情况下使用 TestContainers
  • 对于我的集成测试,我依赖于几个容器化应用程序(例如数据库和更多),'Testcontainers 本身可以从容器内部使用'-> 这是来自那里的网站

标签: testcontainers


【解决方案1】:

这不是完整的答案,但您应该允许从容器内部访问 docker 守护程序。在容器中安装 Docker 并运行它的守护进程很复杂,因此不推荐。 Docker 可以通过 Unix 套接字或 TCP 来控制(我假设主机系统是 Linux)。

How Test containers look for Docker: 默认情况下,它会尝试连接到 Unix 套接字 /var/run/docker.sock。您可以通过设置环境变量(DOCKER_HOST)来指定其他套接字路径或TCP地址。

How docker exposes it's control API: 默认情况下,通过 Unix 套接字 /var/run/docker.sock(在您的主机上)。您可以通过向 docker start 命令添加以下参数来在其他地方公开 docker API(启动 docker 的命令的位置取决于系统):-H fd:// -H tcp://127.0.0.1:2376。请注意,您可以指定多个选项。 -H fd:// - 是默认值,tcp://127.0.0.1:2376 - 告诉 Docker 监听 localhost 端口 2376。

How to make Docker available inside your container ("Docker in Docker"):如果您启用了网络访问 - 除了如上所述将 Testcontaners 指向它之外,无需进行其他配置。如果你想使用默认的 Unix 套接字,那么你可以通过 volume 选项将它映射(挂载)到容器中:

docker run --volume /var/run/docker.sock:/var/run/docker.sock your-image-id-here

剩下的问题是容器内安装的docker.sock 也将归root:docker 所有(与您的主机系统上具有相同的uid:gid),因此只有当您的容器用户可以连接到该套接字时,Testcontainers 才能工作。也就是说,运行进程的用户是 root,或者恰好在容器内具有与主机系统上 docker 的组 id 完全相同的组 id。 我还不知道一个好的解决方案,所以对于初学者来说,你可以在容器内以 root 身份运行测试,或者硬编码容器的用户组 ID 以匹配主机的 docker 组 ID。

【讨论】:

  • 我确实尝试过 docker run --volume /var/run/docker.sock:/var/run/docker.sock your-image-id-here 但无济于事......最终删除Docker 里面的 Docker。谢谢详细解答
  • 不,您不需要(也不应该)在容器内安装“docker”包。测试容器有它自己的(基于 JVM)的 docker API 客户端实现。 Testcontainers 在容器内工作唯一需要做的就是访问 Docker API(通过套接字或 TCP)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 2019-02-01
相关资源
最近更新 更多