You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Cloud Build中使用Java Testcontainers执行测试失败求助

在Cloud Build中运行Testcontainers遇Ryuk错误的解决办法

问题背景

本地用Java Testcontainers启动PostgreSQL容器跑单元测试完全正常,但放到Cloud Build里执行就失败,报错:

Step #1 - "run unit tests":     java.lang.IllegalStateException at RyukResourceReaper.java:132

当前的cloudbuild.yml配置:

- name: 'gcr.io/cloud-builders/docker'
    id: 'Login to myregistry.com'
    entrypoint: 'bash'
    args:
      [
        '-c',
        'docker login --username=$$REGISTRY_USERNAME --password=$$REGISTRY_PASSWORD myregistry.com',
      ]
    secretEnv: ['REGISTRY_USERNAME', 'REGISTRY_PASSWORD']

  - name: "gradle:7.6.1-jdk17"
    id: "run unit tests"
    entrypoint: 'gradle'
    args: ["test"]

已经添加的环境变量:

TESTCONTAINERS_HOST_OVERRIDE=host.docker.internal

问题原因

这个错误核心是Testcontainers的Ryuk进程无法正常与Docker守护进程通信,或是权限不足导致的。Cloud Build本身支持嵌套启动Docker容器,但现有配置缺少关键的套接字挂载和环境变量设置:

  • 默认的gradle镜像未挂载Docker套接字,Testcontainers无法调用Docker API
  • host.docker.internal在Cloud Build环境中存在解析问题,且权限匹配度不足

解决步骤

1. 挂载Docker套接字并配置环境变量

修改cloudbuild.yml,给测试步骤挂载Docker套接字,同时调整环境变量:

完整配置示例:

volumes:
  - name: docker-sock
    hostPath:
      path: /var/run/docker.sock

steps:
  - name: 'gcr.io/cloud-builders/docker'
    id: 'Login to myregistry.com'
    entrypoint: 'bash'
    args:
      [
        '-c',
        'docker login --username=$$REGISTRY_USERNAME --password=$$REGISTRY_PASSWORD myregistry.com',
      ]
    secretEnv: ['REGISTRY_USERNAME', 'REGISTRY_PASSWORD']

  - name: "gradle:7.6.1-jdk17"
    id: "run unit tests"
    entrypoint: 'gradle'
    args: ["test"]
    volumes:
      - name: docker-sock
        path: /var/run/docker.sock
    env:
      - "TESTCONTAINERS_RYUK_DISABLED=true"
      - "DOCKER_HOST=unix:///var/run/docker.sock"

2. 禁用Ryuk

Ryuk是Testcontainers用来自动清理容器的进程,但Cloud Build在构建结束后会自动销毁所有相关容器,完全可以禁用它来绕开通信问题,添加TESTCONTAINERS_RYUK_DISABLED=true即可。

3. 替换Docker主机配置

把原来的TESTCONTAINERS_HOST_OVERRIDE换成DOCKER_HOST=unix:///var/run/docker.sock,直接指定Docker套接字路径,避免host.docker.internal的解析坑。

4. 权限兜底(可选)

如果仍碰到权限问题,可以临时以root用户运行测试步骤(不推荐长期使用,但排查问题时有效):

- name: "gradle:7.6.1-jdk17"
    id: "run unit tests"
    entrypoint: 'bash'
    args: ["-c", "gradle test"]
    volumes:
      - name: docker-sock
        path: /var/run/docker.sock
    env:
      - "TESTCONTAINERS_RYUK_DISABLED=true"
      - "DOCKER_HOST=unix:///var/run/docker.sock"
    securityContext:
      runAsUser: 0

结论

Cloud Build完全支持运行Testcontainers,嵌套启动Docker容器没问题,只要正确挂载Docker套接字、配置好环境变量即可。按上述配置调整后,测试应该能正常运行。

内容的提问来源于stack exchange,提问作者Brian K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:55:25