【问题标题】:Error Can not connect to Ryuk in CircleCi错误无法连接到 CircleCi 中的 Ryuk
【发布时间】:2019-08-22 00:13:16
【问题描述】:

config for CircleCI。 在本地机器上,当你运行 CircleCI 时,一切都会过去。在这种情况下,服务器很多of mistakes,其中一个是

java.lang.IllegalStateException: Can not connect to Ryuk

同时将来在test-containers 之前启动的容器中连接测试时出错,我认为这是由于连接到Ryuk 时出错。混淆了在本地机器上一切正常而在服务器上一切都失败的事实。

【问题讨论】:

    标签: java scala circleci testcontainers


    【解决方案1】:

    问题原因在这里:https://gist.github.com/OlegGorj/52ca84624503a5e85624c6eb38df4590 它说: 环境分离作业和远程docker在不同的环境中运行。因此,Docker 容器无法直接与远程 docker 中运行的容器进行通信。

    访问服务在远程 docker 中启动服务并直接从主容器 ping 它是不可能的(反之亦然)。

    似乎有三个选项:

    1. 在另一个远程 docker 容器中进行整个构建。
    2. 使用专用 VM 进行构建 (https://www.testcontainers.org/supported_docker_environment/continuous_integration/circle_ci/)
    3. 如果您可以一开始就创建测试容器,那么就这样做并且不要在 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 来修复它。

    您可以在首选项中找到它们。

    【讨论】:

      猜你喜欢
      • 2022-07-20
      • 2021-12-10
      • 2021-07-27
      • 2022-10-04
      • 2019-01-23
      • 1970-01-01
      • 2014-12-01
      • 2014-02-03
      • 2018-10-07
      相关资源
      最近更新 更多