4

CircleCI有配置。在本地机器上,当你运行 CircleCI 时,一切都会过去。在这种情况下,服务器出现了很多错误,其中之一是

java.lang.IllegalStateException: Can not connect to Ryuk

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

4

2 回答 2

2

我有同样的错误,通过关闭 Docker 中的实验功能来修复它。

您可以在首选项中找到它们。 实验功能 Docker

于 2020-11-10T14:28:13.903 回答
2

问题的原因在这里: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 中使用 testcontainers ( 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"))以确定采用哪种方法.
于 2020-07-13T12:05:21.377 回答