GitLab-CI用私有仓库Docker:dind运行TestContainers遇环境错误
背景
出于安全要求,仅允许使用企业内部容器镜像仓库的镜像,尝试在GitLab-CI中通过Docker-in-Docker运行Java TestContainers。
正常工作的配置
使用官方Docker DinD镜像时,流水线正常执行且测试通过,配置如下:
test: image: internalregistry.azurecr.io/maven:3.9-eclipse-temurin-17 services: - docker:24.0.5-dind stage: test variables: DOCKER_HOST: tcp://docker:2375 DOCKER_TLS_CERTDIR: "" DOCKER_DRIVER: overlay2 before_script: - echo "hub.image.name.prefix=internalregistry.azurecr.io/" > $HOME/.testcontainers.properties script: - mvn clean test
同步镜像到私有仓库
将官方DinD镜像同步至内部仓库的命令:
docker pull docker:24.0.5-dind docker tag docker:24.0.5-dind internalregistry.azurecr.io/docker:24.0.5-dind docker push internalregistry.azurecr.io/docker:24.0.5-dind
修改配置后的报错
将services替换为私有仓库的镜像后:
services: - internalregistry.azurecr.io/docker:24.0.5-dind
流水线执行失败,报错:
无法找到有效的Docker环境,请检查配置。
尝试过的配置如下:
UnixSocketClientProviderStrategy:执行失败,异常为InvalidConfigurationException(找不到Unix域套接字)。根本原因是NoSuchFileException (/var/run/docker.sock)
未找到任何有效配置,执行无法继续。
正常执行时,TestContainers的日志显示:
日志记录器":"org.testcontainers.dockerclient.DockerClientProviderStrategy","消息":"通过环境变量、系统属性和默认值找到Docker环境。解析出dockerHost=tcp://docker:2375"
尝试的解决方法及结果
尝试在before_script中指定TestContainers的Docker客户端策略:
before_script: - echo "hub.image.name.prefix=internalregistry.azurecr.io/" > $HOME/.testcontainers.properties - echo "docker.client.strategy=org.testcontainers.dockerclient.DockerClientProviderStrategy" >> $HOME/.testcontainers.properties
但仍失败,报错:
日志记录器":"org.testcontainers.dockerclient.DockerClientProviderStrategy","消息":"无法从org.testcontainers.dockerclient.DockerClientProviderStrategy实例化策略"
底层错误日志
{"timestamp":"2023-12-19T09:02:21.104Z","level":"WARN","thread":"main","logger":"org.testcontainers.dockerclient.DockerClientProviderStrategy","message":"DOCKER_HOST tcp://docker:2375 未在监听","context":"default"}
{"timestamp":"2023-12-19T09:02:21.280Z","level":"INFO","thread":"main","logger":"org.testcontainers.dockerclient.DockerMachineClientProviderStrategy","message":"未在PATH ([/opt/java/openjdk/bin, /usr/local/sbin, /usr/local/bin, /usr/sbin, /usr/bin, /sbin, /bin]) 中找到docker-machine可执行文件","context":"default"}
{"timestamp":"2023-12-19T09:02:21.281Z","level":"ERROR","thread":"main","logger":"org.testcontainers.dockerclient.DockerClientProviderStrategy","message":"无法找到有效的Docker环境,请检查配置。尝试过的配置如下:\n\tUnixSocketClientProviderStrategy:执行失败,异常为InvalidConfigurationException(找不到Unix域套接字)。根本原因是NoSuchFileException (/var/run/docker.sock)\n未找到任何有效配置,执行无法继续。","context":"default"}
内容的提问来源于stack exchange,提问作者Andy

