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

2024-03-09

如何跑步@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/ https://www.testcontainers.org/supported_docker_environment/continuous_integration/dind_patterns/


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

测试容器如何寻找 Docker https://www.testcontainers.org/supported_docker_environment/#docker-environment-discovery: 默认情况下它会尝试连接到 Unix 套接字/var/run/docker.sock。您可以通过设置环境变量来指定其他套接字路径或TCP地址(DOCKER_HOST).

docker 如何公开它的控制 API https://success.docker.com/article/how-do-i-enable-the-remote-api-for-dockerd: 默认情况下通过 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。

如何使 Docker 在容器内可用(“Docker in Docker”) https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/:如果您启用了网络访问 - 除了如上所述将 Testcontaners 指向它之外,无需执行其他配置。如果你想使用默认的 Unix 套接字,那么你可以通过以下方式将其映射(挂载)到容器中:volume option:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测试容器;在 docker 内运行 @Testcontainers 测试 [在 Docker 内运行 Docker] 的相关文章

  • 如何在 Windows 中向 AD 组添加自定义属性?

    我想知道如何编写这个脚本 另外 是否有一个开箱即用的 GUI 工具可以让我做到这一点 您是指扩展 AD 架构时交换添加的 CustomField 属性吗 如果是这样 那么你可以使用ADSIEdit http technet microsof
  • Symfony2 - 自定义错误页面永远不会显示

    我正在尝试自定义 error html twig error403 html twig error404 html twig 和 error500 html twig 到目前为止 我已尝试获取由 a 引起的 error403 html tw
  • RxJava2 - 同步执行调用

    I ve a TestService 我在其中执行异步任务来获取数据 我想等待回复后再继续 public List
  • 使用 fft 查找每个谐波的相位

    我用的是Matlab 我有一个正弦信号 X 放大器 220 频率 50 我添加了 3 个谐波 x1 gt h2 放大器 30 频率 100 相位 30 x2 gt h4 放大器 10 频率 200 相位 50 x3 gt h6 放大器 05
  • 在C中分配浮点指针[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我目前拥有的是一个简单的函数 它基本上只是根据给定的参数指针重新分配指针 但我收到一条错误消息 说我正在使用未初始化的变量之一 这是我所拥有
  • 具有实时示例的设计模式[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想通过实时示例学习设计模式 那么有人可以建议我可以从哪里开始吗 这些经典的设计模式是每个开发人员都应该了解的 因为它有助于我们与其他
  • Xamarin 表单选取器 SelectedItem 绑定

    Xamarin 表单文档Xamarin Forms Picker SelectedItem https developer xamarin com api property Xamarin Forms Picker SelectedItem

随机推荐