错误无法连接到 CircleCi 中的 Ryuk
Posted
技术标签:
【中文标题】错误无法连接到 CircleCi 中的 Ryuk【英文标题】:Error Can not connect to Ryuk in CircleCi 【发布时间】:2019-08-22 00:13:16 【问题描述】:有config for CircleCI。 在本地机器上,当你运行 CircleCI 时,一切都会过去。在这种情况下,服务器很多of mistakes,其中一个是
java.lang.IllegalStateException: Can not connect to Ryuk
同时将来在test-containers
之前启动的容器中连接测试时出错,我认为这是由于连接到Ryuk
时出错。混淆了在本地机器上一切正常而在服务器上一切都失败的事实。
【问题讨论】:
【参考方案1】:问题原因在这里:https://gist.github.com/OlegGorj/52ca84624503a5e85624c6eb38df4590 它说: 环境分离作业和远程docker在不同的环境中运行。因此,Docker 容器无法直接与远程 docker 中运行的容器进行通信。
访问服务在远程 docker 中启动服务并直接从主容器 ping 它是不可能的(反之亦然)。
似乎有三个选项:
-
在另一个远程 docker 容器中进行整个构建。
使用专用 VM 进行构建 (https://www.testcontainers.org/supported_docker_environment/continuous_integration/circle_ci/)
如果您可以一开始就创建测试容器,那么就这样做并且不要在 circleci (https://circleci.com/docs/2.0/executor-types/#using-multiple-docker-images) 中使用测试容器。请记住,每个测试用例都将与同一个服务实例进行交互。
关于选项 3 的更多详细信息
基本上,使用circleci时不要使用testcontainers(一个词)。 在你的 circleci/config.yaml 中做这样的事情:
jobs:
build:
docker:
- image: circleci/openjdk:14.0.1-jdk-buster
- image: rabbitmq:3.8-alpine
environment:
所以 circleci 在与您的图像相同的主机上运行 rabbit 容器。 然后,您可以在它打开的任何端口上在 localhost 上与它通信,并且当您的构建(始终在第一个容器中)完成时,circleci 将关闭这些辅助容器。
这样做有一些缺点:
testcontainers 允许您启动和停止容器,但这种方法不能,因此您根本无法测试容器的重启。 您的所有测试都将使用同一个实例运行,因此,在 rabbit 实例中,每个测试都应使用唯一的交换和队列。 如果像我一样,您需要在 circleci 和桌面(以及 Jenkins)中构建,那么您需要在测试中使用 circleci 条件逻辑(只需检查 System.getenv("CIRCLECI"))以确定哪个采取的方法。【讨论】:
当您说“在开始时创建测试容器......并且不要在 circleci 中使用测试容器”时,您是什么意思以及如何实现? 编辑了我的答案以提供更多详细信息。【参考方案2】:我遇到了同样的错误,通过关闭 Docker 中的 Experimental Features 来修复它。
您可以在首选项中找到它们。
【讨论】:
以上是关于错误无法连接到 CircleCi 中的 Ryuk的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.IllegalStateException:无法在 localhost:49167 连接到 Ryuk
Docker:尝试使用本地 CircleCI 构建连接到 Docker 守护程序时权限被拒绝