GitLab Pipeline构建Quarkus项目Docker化时遇Ryuk容器启动错误
问题诊断与修复方案
从报错信息来看,核心问题有两个:
- GitLab Runner容器内缺失Docker CLI:
No docker binary found明确说明,Quarkus构建容器镜像需要调用Docker命令,但当前使用的maven:latest镜像未预装Docker客户端。 - Ryuk容器启动失败:Ryuk是Testcontainers的容器清理组件,即便添加了
-DskipTests,部分Quarkus扩展或构建流程仍可能触发Testcontainers初始化,而Runner环境未正确配置Docker访问权限。
具体修复步骤
1. 补充Docker CLI环境
有两种方式解决Docker CLI缺失问题:
- 更换预装Docker的Maven镜像:
image: maven:3.9-eclipse-temurin-17-alpine - 在
before_script中安装Docker CLI:before_script: - apt-get update -qq - apt-get install -y -qq build-essential libz-dev zlib1g-dev docker.io
2. 配置GitLab Runner挂载Docker Socket
如果使用Docker executor类型的GitLab Runner,需要修改Runner的config.toml,挂载宿主机的Docker Socket,让Runner容器内的Docker CLI能访问宿主机的Docker daemon:
[[runners]] name = "Docker Runner" url = "https://your-gitlab-instance.com/" token = "your-runner-token" executor = "docker" [runners.docker] tls_verify = false image = "maven:latest" privileged = false volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
3. 强制禁用Testcontainers
如果不需要Testcontainers参与任何构建环节,添加参数彻底禁用它:
script: - mvn clean package -DskipTests -Dquarkus.profile=dev -Dquarkus.container-image.build=true -Dquarkus.container-image.push=true -Dquarkus.container-image.group=pss -Dquarkus.container-image.tag=$CI_BUILD_REF -Dquarkus.container-image.registry=$DOCKER_REGISTRY_AZURE_URL -Dquarkus.container-image.username=$DOCKER_REGISTRY_AZURE_USERNAME -Dquarkus.container-image.password=$DOCKER_REGISTRY_AZURE_PASSWORD -Dtestcontainers.enabled=false
4. 修复Docker Socket访问权限
确保Runner容器内的用户有权限访问挂载的Docker Socket,可在before_script中添加:
before_script: - ... - usermod -aG docker $USER
验证用完整Pipeline示例
image: maven:3.9-eclipse-temurin-17-alpine stages: - build-package-dockerize - deploy before_script: - apk add --no-cache docker-cli - addgroup -S docker && adduser -S $USER -G docker build, package, dockerize: stage: build-package-dockerize script: - mvn clean package -DskipTests -Dquarkus.profile=dev -Dquarkus.container-image.build=true -Dquarkus.container-image.push=true -Dquarkus.container-image.group=pss -Dquarkus.container-image.tag=$CI_BUILD_REF -Dquarkus.container-image.registry=$DOCKER_REGISTRY_AZURE_URL -Dquarkus.container-image.username=$DOCKER_REGISTRY_AZURE_USERNAME -Dquarkus.container-image.password=$DOCKER_REGISTRY_AZURE_PASSWORD -Dtestcontainers.enabled=false only: - DEV
内容的提问来源于stack exchange,提问作者Giamma
相关产品推荐
相关产品推荐

