GitLab Runner构建Docker镜像时报docker: not found错误求助
问题根因分析
你遇到的docker: not found报错有两个核心原因:
- 你当前CI任务使用的基础镜像是
trivy官方镜像,该镜像仅预装了trivy相关组件,没有内置docker CLI工具,无法直接执行docker相关命令 - trivy镜像默认设置了
ENTRYPOINT ["trivy"],如果不主动覆盖入口点,CI执行的所有脚本命令都会被默认当作trivy的参数执行,也会导致命令执行异常
解决方案
方案一:拆分CI任务(最推荐)
将镜像构建和镜像扫描拆分为两个独立的CI任务,实现职责分离,避免基础镜像依赖冲突:
- 新增镜像构建任务,使用官方
docker:latest作为基础镜像,搭配docker:dind服务完成镜像构建和推送 - 保留容器扫描任务专门负责镜像安全检测,直接拉取前序任务构建好的镜像进行扫描即可,无需在扫描任务中执行构建操作
示例配置参考:
stages: - build - test # 镜像构建任务 build_image: stage: build image: docker:latest services: - docker:dind variables: DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG # 容器扫描任务 container_scanning: stage: test image: name: $CI_REGISTRY/devops/trivy/trivy:0.20.1 entrypoint: [""] # 覆盖默认ENTRYPOINT,保证CI脚本正常执行 variables: FULL_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG script: - trivy image --skip-update --exit-code 1 --no-progress $FULL_IMAGE_NAME
方案二:单任务实现构建+扫描
如果必须在同一个任务中完成两个操作,需要调整CI配置适配依赖:
- 覆盖trivy镜像的默认ENTRYPOINT
- 任务启动后手动安装docker CLI,同时配置docker:dind服务保证docker daemon可用
示例配置参考:
container_scanning: stage: test image: name: $CI_REGISTRY/devops/trivy/trivy:0.20.1 entrypoint: [""] # 关键配置:覆盖默认的trivy入口点 services: - docker:dind # 挂载docker daemon服务 variables: GIT_STRATEGY: none FULL_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG DOCKER_HOST: tcp://docker:2375/ DOCKER_DRIVER: overlay2 DOCKER_TLS_CERTDIR: "" script: # 先安装docker CLI - apk add --no-cache docker - docker build -t testdocker . - trivy image --skip-update --exit-code 1 --no-progress testdocker
附加问题修正
你提供的Dockerfile存在语法错误,FROM关键字后不能留空,需要调整为:
FROM Test.dev/devops/aquasec/trivy:0.16.0 RUN trivy filesystem --skip-update --exit-code 1 --no-progress /
内容的提问来源于stack exchange,提问作者user2201789
相关产品推荐
相关产品推荐

