gpt4 book ai didi

测试容器;在 docker 中运行 @Testcontainers 测试 [在 Docker 中运行 Docker]

转载 作者:行者123 更新时间:2023-12-03 19:19:56 28 4
gpt4 key购买 nike

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

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

我们在容器中运行所有东西,构建在 docker jenkins 镜像上运行。
Docker 文件正在创建 jar,然后创建图像。 @Testcontainers找不到安装的docker。
下面是我的 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 并运行它的守护进程很复杂,所以不推荐。 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 监听本地主机端口 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组标识。

关于测试容器;在 docker 中运行 @Testcontainers 测试 [在 Docker 中运行 Docker],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59579845/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com