带有Docker插座绑定的GitLab跑步者和测试范围

发布于 2025-02-10 11:00:55 字数 3156 浏览 3 评论 0原文

我正在使用 testContainers 开始我的Junit Test的PostgreSQL DB。本地一切正常。这是我的小测试项目:

https://gitlab.com/janning/tpj-tpj-testcontainer

我可以使用./ gradlew Test在我的IDE内和CLI上进行测试

现在我想在我的gitlab-ci管道中运行它,但是没有 docker-indocker( dind)。因此,我需要安装Docker套接字,在此处记录:

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800
[[runners]]
  name = "kt103-tpj"
  url = "https://gitlab.com"
  token = "XXXXXXXXXXXXXXXXX"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "registry.gitlab.com/janning/tpj-testcontainer/debian:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    extra_hosts = ["host.docker.internal:host-gateway"]
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
    shm_size = 0

​.gitlab-ci.yml“ rel =“ nofollow noreferrer”> gitlab-ci.yml 构建一个dockerimage,因为我需要OpenJDK-17和一些Docker命令。

variables:
  TESTCONTAINERS_HOST_OVERRIDE: "host.docker.internal"
stages:
  - dockerimage
  - test

dockerimage:
  image: docker:latest
  stage: dockerimage
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
    - tag=":latest"
    - docker build --pull -t "$CI_REGISTRY_IMAGE/debian${tag}" .
    - docker push "$CI_REGISTRY_IMAGE/debian${tag}"

test:
  stage: test
  image: $CI_REGISTRY_IMAGE/debian:latest
  script:
    - echo $DOCKER_HOST
    - echo $DOCKER_TLS_VERIFY
    - echo $DOCKER_CERT_PATH
    - ./gradlew test
  artifacts:
    when: always
    reports:
      junit: build/test-results/test/**/TEST-*.xml

作业“测试”失败(在此处完成日志

任务:测试Hallotest> test()失败 java.lang.illegalstateException at Ryukresourcereaper.java:129 1测试完成,1个失败 任务:测试失败

如果我深入研究Junit结果,我可以看到以下 stacktrace

java.lang.IllegalStateException: Could not connect to Ryuk at host.docker.internal:49158
at org.testcontainers.utility.RyukResourceReaper.maybeStart(RyukResourceReaper.java:129)
at org.testcontainers.utility.RyukResourceReaper.init(RyukResourceReaper.java:42)
at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:203)
at ...

我想这与我构建的Docker映像有关。但是我不知道问题是什么。我没有如何解决或调试这种情况。

RYUK容器是在我的主机中启动的,该容器正在运行Gitlab-Runner。但是它无法连接:

$ docker容器日志-f ba62a173aafd 2022/06/24 09:42:51 Pinging Docker ... 2022/06/24 09:42:51 Docker Daemon可用! 2022/06/24 09:42:51从港口8080开始... 2022/06/24 09:42:51开始了! 恐慌:超时等待第一个连接 Goroutine 1 [运行]: main.main() /go/src/github.com/testcontainers/moby-ryuk/main.go:50 +0x449

I am using testcontainers to start a Postgresql DB for my junit test. Locally everything works fine. This is my small test project:

https://gitlab.com/janning/tpj-testcontainer

I can run the test inside my IDE and on CLI with ./gradlew test

Now I want to run it in my Gitlab-CI Pipeline but without docker-in-docker (dind). So I need to mount the docker socket, which is documented here: https://www.testcontainers.org/supported_docker_environment/continuous_integration/gitlab_ci/

so I configred my gitlab-runner like this:

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800
[[runners]]
  name = "kt103-tpj"
  url = "https://gitlab.com"
  token = "XXXXXXXXXXXXXXXXX"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "registry.gitlab.com/janning/tpj-testcontainer/debian:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    extra_hosts = ["host.docker.internal:host-gateway"]
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
    shm_size = 0

First my gitlab-ci.yml builds a Dockerimage as I need openjdk-17 and some docker commands.

variables:
  TESTCONTAINERS_HOST_OVERRIDE: "host.docker.internal"
stages:
  - dockerimage
  - test

dockerimage:
  image: docker:latest
  stage: dockerimage
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
    - tag=":latest"
    - docker build --pull -t "$CI_REGISTRY_IMAGE/debian${tag}" .
    - docker push "$CI_REGISTRY_IMAGE/debian${tag}"

test:
  stage: test
  image: $CI_REGISTRY_IMAGE/debian:latest
  script:
    - echo $DOCKER_HOST
    - echo $DOCKER_TLS_VERIFY
    - echo $DOCKER_CERT_PATH
    - ./gradlew test
  artifacts:
    when: always
    reports:
      junit: build/test-results/test/**/TEST-*.xml

The job "test" failed (complete log here)

Task :test HalloTest > test() FAILED
java.lang.IllegalStateException at RyukResourceReaper.java:129 1 test completed, 1 failed
Task :test FAILED

If i dig deeper into the junit result I can see the following stacktrace:

java.lang.IllegalStateException: Could not connect to Ryuk at host.docker.internal:49158
at org.testcontainers.utility.RyukResourceReaper.maybeStart(RyukResourceReaper.java:129)
at org.testcontainers.utility.RyukResourceReaper.init(RyukResourceReaper.java:42)
at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:203)
at ...

I guess it has something to do with the docker image, which I build. But I am stuck as I don't know what the problem is. I don't how to solve or debug this situation.

The ryuk container is started in my host which is running gitlab-runner. But it can't connect:

$ docker container logs -f ba62a173aafd
2022/06/24 09:42:51 Pinging Docker...
2022/06/24 09:42:51 Docker daemon is available!
2022/06/24 09:42:51 Starting on port 8080...
2022/06/24 09:42:51 Started!
panic: Timed out waiting for the first connection
goroutine 1 [running]:
main.main()
/go/src/github.com/testcontainers/moby-ryuk/main.go:50 +0x449

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

玩套路吗 2025-02-17 11:00:55

问题只是防火墙问题阻止了Docker容器之间的流量。由于我可以从外部到达任何Docker容器,所以我花了一段时间才意识到它。

The problem was just a firewall problem blocking traffic between the docker containers. As I could reach any docker container from external, it took my quite a while until I realized it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文