如何查找自带docker的JDK镜像或向openjdk:8添加docker工具
报错原因说明
你遇到的报错是CI任务使用的基础镜像中未预装Docker CLI,系统无法在PATH路径中找到可执行的docker命令导致的。
方案1:查找预装Docker的OpenJDK系列镜像
- 直接在公共镜像仓库搜索关键词如
openjdk docker、openjdk 8 docker,优先选择下载量高、维护活跃的镜像 - 找到后替换你的
.gitlab-ci.yml中image字段的配置即可直接使用,使用前注意核对镜像内的JDK版本、Docker版本是否符合你的业务需求
方案2:自行给openjdk:8镜像添加Docker支持
如果找不到合适的预装镜像,有两种实现方式:
方式1:在CI任务运行时临时安装(无需自行构建镜像)
直接在.gitlab-ci.yml的before_script阶段添加Docker安装逻辑,示例配置如下:
your_job: image: openjdk:8 services: - docker:dind variables: DOCKER_HOST: tcp://docker:2375 DOCKER_DRIVER: overlay2 before_script: # 安装Docker CLI依赖 - apt-get update && apt-get install -y ca-certificates curl gnupg lsb-release - mkdir -p /etc/apt/keyrings - curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg - echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null - apt-get update && apt-get install -y docker-ce-cli script: # 你的原有任务执行逻辑 - mvn clean package
这种方式的优势是不需要额外维护自定义镜像,缺点是每次运行任务都要执行安装步骤,会增加CI运行耗时。
方式2:构建自定义的OpenJDK+Docker镜像(适合长期使用)
编写Dockerfile构建专属镜像,一次构建后续所有CI任务都可以直接复用:
- 新建Dockerfile,内容如下:
FROM openjdk:8 # 预装Docker CLI RUN apt-get update && apt-get install -y ca-certificates curl gnupg lsb-release \ && mkdir -p /etc/apt/keyrings \ && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg \ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \ && apt-get update && apt-get install -y docker-ce-cli \ # 清理apt缓存减小镜像体积 && rm -rf /var/lib/apt/lists/*
- 执行构建命令推到你的私有镜像仓库:
docker build -t your-registry/openjdk-8-docker:latest . && docker push your-registry/openjdk-8-docker:latest - 替换
.gitlab-ci.yml中的镜像配置即可:
your_job: image: your-registry/openjdk-8-docker:latest services: - docker:dind variables: DOCKER_HOST: tcp://docker:2375 DOCKER_DRIVER: overlay2 script: # 你的原有任务执行逻辑 - mvn clean package
内容的提问来源于stack exchange,提问作者Kevin Meredith
相关产品推荐
相关产品推荐

