无法在Docker容器中启动Testcontainers测试容器
Testcontainers在TeamCity代理容器中连接Ryuk失败的解决方案
本地运行Testcontainers时一切正常,但在Docker化的TeamCity代理中执行测试时,出现无法连接Ryuk的异常,报错信息如下:
Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.IllegalStateException: Could not connect to Ryuk at 172.17.0.1:63964 [in thread "Test worker"] at org.testcontainers.utility.RyukResourceReaper.maybeStart(RyukResourceReaper.java:145) at org.testcontainers.utility.RyukResourceReaper.init(RyukResourceReaper.java:42) at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:232) at org.testcontainers.DockerClientFactory$1.getDockerClient(DockerClientFactory.java:106) at com.github.dockerjava.api.DockerClientDelegate.authConfig(DockerClientDelegate.java:109) at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:332) at com.kamcci.numberbox.infra.orm.jpa.adapter.config.MysqlTCExtension.<clinit>(MysqlTCExtension.kt:20)
对应的TeamCity代理docker-compose配置:
teamcity-agent-1: image: jetbrains/teamcity-agent:latest depends_on: - teamcity container_name: agent011 restart: always ports: - 9081:9090 volumes: - ./agents/agent-1/conf:/data/teamcity_agent/conf - /var/run/docker.sock:/var/run/docker.sock environment: - SERVER_URL=http://teamcity:8111 - AGENT_NAME=agent011 - DOCKER_IN_DOCKER=start
解决方案
指定宿主机IP覆盖
Ryuk默认尝试连接Docker网关IP,但容器环境下可能无法正常访问。添加环境变量TESTCONTAINERS_HOST_OVERRIDE=host.docker.internal,让Testcontainers通过这个通用域名访问宿主机,解决网络连通问题。调整Docker-in-Docker配置
当前配置中DOCKER_IN_DOCKER=start会在代理容器内启动独立的Docker守护进程,导致网络隔离。如果不需要内部Docker环境,直接去掉这个环境变量,让代理使用宿主机的Docker daemon,简化网络连通逻辑。临时禁用Ryuk
如果不需要自动清理测试容器的功能,可以设置TESTCONTAINERS_RYUK_DISABLED=true绕过连接检查,但测试结束后需要手动清理残留容器。确保Docker套接字权限
确认代理容器内的用户有权限访问挂载的/var/run/docker.sock,可以通过将容器用户加入docker组,或者临时调整套接字权限(生产环境谨慎使用)。
修改后的docker-compose示例:
teamcity-agent-1: image: jetbrains/teamcity-agent:latest depends_on: - teamcity container_name: agent011 restart: always ports: - 9081:9090 volumes: - ./agents/agent-1/conf:/data/teamcity_agent/conf - /var/run/docker.sock:/var/run/docker.sock environment: - SERVER_URL=http://teamcity:8111 - AGENT_NAME=agent011 - TESTCONTAINERS_HOST_OVERRIDE=host.docker.internal # 可选:禁用Ryuk # - TESTCONTAINERS_RYUK_DISABLED=true
内容的提问来源于stack exchange,提问作者정요직
相关产品推荐
相关产品推荐

