如何跑步@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(使用前将#替换为@)