如何@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"]
Run Code Online (Sandbox Code Playgroud)
在运行构建时,我低于错误
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)。
测试容器如何查找 Docker:默认情况下,它会尝试连接到 Unix 套接字/var/run/docker.sock。您可以通过设置环境变量 ( ) 来指定其他套接字路径或 TCP 地址DOCKER_HOST。
docker 如何公开它的控制 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。
如何使 Docker 在容器内可用(“Docker in Docker”):如果启用了网络访问 - 除了如上所述将 Testcontaners 指向它之外,无需执行其他配置。如果你想使用默认的 Unix 套接字,那么你可以通过volume选项将其映射(挂载)到容器中:
docker run --volume /var/run/docker.sock:/var/run/docker.sock your-image-id-here
Run Code Online (Sandbox Code Playgroud)
剩下的问题是,安装在容器内的也将由(与主机系统上相同的 uid:gid)docker.sock拥有,因此只有当容器用户可以连接到该套接字时,测试容器才会工作。root:docker也就是说,正在运行的进程的用户是 root,或者恰好在容器内具有与主机系统上 docker 的组 id 完全相同的组 id。我还不知道对此有什么好的解决方案,因此对于初学者来说,您可以以 root 身份在容器内运行测试,或者对容器的用户组 ID 进行硬编码以匹配主机的docker组 ID。
| 归档时间: |
|
| 查看次数: |
4844 次 |
| 最近记录: |