GitLab CI自定义镜像使用报错:docker not found问题求助
问题描述
我先构建了一个基准镜像(Stage A),然后在后续阶段(Stage B)尝试使用该镜像。镜像已成功构建,但后续阶段执行时出现错误:
docker not found error
附上我的配置文件:
.gitlab-ci.yml
stages: - build-base - build-addons build: stage: build-base image: docker:20.10.3 # tags: # # - docker services: - docker:dind script: - date=$(date '+%Y%m%d') - echo $date - echo $CI_REGISTRY_IMAGE - docker build --progress=plain -t $CI_REGISTRY_IMAGE:latest -f test.Dockerfile . - docker push $CI_REGISTRY_IMAGE:latest build_terraform: image: $CI_REGISTRY_IMAGE:latest stage: build-addons timeout: 1 hour # services: # - docker:dind script: - echo $CI_REGISTRY_IMAGE - docker info - docker build --pull -t $CI_REGISTRY_IMAGE:date -f addons.Dockerfile .
Dockerfile(test.Dockerfile)
# Use the Red Hat Enterprise Linux 8 base image FROM registry.access.redhat.com/ubi8/ubi # Install necessary packages and dependencies RUN yum install -y yum-utils device-mapper-persistent-data lvm2 && \ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && \ yum install -y docker-ce docker-ce-cli containerd.io && \ yum clean all
问题分析与解决方案
核心问题
- Docker服务未启动:自定义基准镜像虽然安装了Docker客户端和服务端,但GitLab CI启动容器时默认不会自动启动Docker服务,导致执行
docker命令时找不到运行的daemon。 - 缺少Docker Daemon依赖:
build_terraform阶段未启用docker:dind服务,即使容器内装了Docker,也需要连接到可用的Docker daemon才能执行命令。 - CI配置语法错误:
buildjob的script部分存在缩进错误,build_terraform里的镜像标签变量未正确定义。
修复步骤
方案1:修复自定义镜像的使用配置
修改.gitlab-ci.yml的build_terraform job,启用docker:dind服务并配置环境变量,同时启动容器内的Docker服务:
build_terraform: image: $CI_REGISTRY_IMAGE:latest stage: build-addons timeout: 1 hour services: - docker:dind variables: DOCKER_HOST: tcp://docker:2375 # 连接到dind服务的Docker daemon DOCKER_TLS_CERTDIR: "" # 禁用TLS简化配置(生产环境建议启用) script: - echo $CI_REGISTRY_IMAGE - systemctl start docker # 启动容器内的Docker服务 - docker info - docker build --pull -t $CI_REGISTRY_IMAGE:$(date '+%Y%m%d') -f addons.Dockerfile .
方案2:直接使用官方Docker镜像(更推荐)
无需自定义基准镜像,直接复用官方docker镜像配合docker:dind服务,避免维护自定义镜像的成本:
build_terraform: image: docker:20.10.3 stage: build-addons timeout: 1 hour services: - docker:dind variables: DOCKER_HOST: tcp://docker:2375 DOCKER_TLS_CERTDIR: "" script: - echo $CI_REGISTRY_IMAGE - docker info - docker build --pull -t $CI_REGISTRY_IMAGE:$(date '+%Y%m%d') -f addons.Dockerfile .
修复build job的语法错误
原build job的script部分缩进错误,修正后:
build: stage: build-base image: docker:20.10.3 # tags: # # - docker services: - docker:dind script: - date=$(date '+%Y%m%d') - echo $date - echo $CI_REGISTRY_IMAGE - docker build --progress=plain -t $CI_REGISTRY_IMAGE:latest -f test.Dockerfile . - docker push $CI_REGISTRY_IMAGE:latest
内容的提问来源于stack exchange,提问作者Judi
相关产品推荐
相关产品推荐

