镜像构建问题

本文主要为您介绍基础镜像构建的问题汇总与解决方案梳理。

从海外下载基础镜像导致流水线镜像构建任务缓慢

  • 问题描述:当您使用云效进行镜像构建时,如果你的Dockerfile中,指定从dockerhub下载镜像,比如:

    • FROM Nginx

    • FROM java:8

    • FROM openjdk:8-jdk-alpine

    Flow在构建时,就会从Dockerhub拉取镜像,由于海外网络延时问题,会导致整体构建速度极其缓慢。典型现象如下:从 Dockerhub 下载基础镜像 且 构建缓慢

  • 解决方案:按照以下步骤,修改您的 Dockerfile:

    • 将境外镜像在 PULL 到本地。

      docker pull openjdk:8-jdk-alpine
    • 将基础镜像 push 到阿里云镜像仓库(cr.console.aliyun.com)的国内 region(比如北京、上海等)。

      docker tag openjdk:8-jdk-alpine registry.cn-beijing.aliyuncs.com/yournamespace/openjdk:8-jdk-alpine
      docker push registry.cn-beijing.aliyuncs.com/yournamespace/openjdk:8-jdk-alpine
    • 修改dockerfile 中 FROM,从您自己的镜像仓库下载镜像 。

      from registry.cn-beijing.aliyuncs.com/yournamespace/openjdk:8-jdk-alpine

dockerhub镜像作为基础镜像构建失败

  • 问题描述:镜像构建失败,可能是 dockerhub 基础镜像升级导致的。

  • 解决方案:以 maven:3-jdk-8 为例,找到最后一次成功的构建日志,复制其中的 sha256 值:

    [10:45:37] 3-jdk-8: Pulling from library/maven
    [10:45:38] Digest: sha256:ff18d86faefa15d1445d0fa4874408cc96dec068eb3487a0fc6d07f359a24607
    [10:45:38] Status: Image is up to date for maven:3-jdk-8

    Dockerfile中将基础镜像改成 maven:3-jdk-8@sha256:ff18d86faefa15d1445d0fa4874408cc96dec068eb3487a0fc6d07f359a24607 即可。

使用私有镜像仓库

构建环境中的“使用私有镜像仓库”是什么意思?是可以指定构建的容器吗?

“使用私有镜像仓库”是指在构建环境中可以指定自定义的Docker镜像仓库地址,而不是使用默认的公共镜像。您可以将自己的构建环境打包成一个Docker镜像,并上传到阿里云的容器镜像服务(ACR)或其他私有镜像仓库。在流水线配置中,选择“使用私有镜像仓库”,并输入完整的镜像地址。这样,您就可以使用自定义的构建环境进行构建。

image.png

Docker 构建出现FROM:... 卡住

这种情况是由于 docker 构建的基础镜像下载不下来,可以把 FROM 的镜像 pull 到本地,再 push 到阿里云镜像服务的仓库 加速镜像构建。

创建Docker build 提示没有权限

请检查 Dockerfile 中的 FROM 镜像是否为公共镜像。

Docker build 的时候找不到 COPY 的文件

请检查 Dockerfile 中使用到的文件在构建后是确实存在的,且 Dockerfile 写的相对 context path 的路径配置正确。

Docker build 的时候克隆代码失败

请检查 Dockerfile 中克隆的代码库是否为公共代码仓库,如果不是需要在 Dockerfile 或基础镜像中对私有代码仓库进行授权。

流水线镜像构建报错failed to calculate checksum of ref xxxx: "xxx": not found

场景描述

流水线镜像构建COPY阶段报错failed to calculate checksum of ref xxxx, "xxx": not found。

报错样例:

2025-06-19 19:03:07 [INFO] --------------------
2025-06-19 19:03:07 [INFO] 2 | 
2025-06-19 19:03:07 [INFO] 3 | RUN mkdir -p /usr/share/nginx/html/
2025-06-19 19:03:07 [INFO] 4 | >>> COPY dist/ /usr/share/nginx/html/
2025-06-19 19:03:07 [INFO] 5 | COPY cicd/nginx/production.conf /etc/nginx/conf.d/
2025-06-19 19:03:07 [INFO] 6 | COPY cicd/nginx/nginx.conf /etc/nginx/nginx.conf
2025-06-19 19:03:07 [INFO] --------------------
2025-06-19 19:03:07 [INFO] ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref xxxxx::xxxxx: "/dist": not found

排查思路

根据报错以及报错日志的步骤3可以确定这是在执行COPY命令的时候找不到源目录,样例中的话就是找不到dist目录。

  1. 确定源文件路径,目标文件路径是否存在。

    确定构建时是否指定contextPath,可以查看构建步骤中contextPath变量是否有设置,基础路径+COPY命令路径的拼接方式检查源文件是否存在。

    • 构建时候指定contextPath:以contextPath目录作为基础路径进行COPY

    • 构建时候未指定contextPath:以Dockerfile文件所在目录作为基础路径进行COPY

      如图为未指定contextPath变量:

      image

  2. 检查Dockerfile所在目录下是否存在.dockerignore文件,以及文件中是否指定对应路径。

    .dockerignore 文件的作用:用于指定哪些文件和目录不应包含在 Docker 构建上下文中。

    在构建时候如果系统加载了.dockerignore文件,很可能.dockerignore文件中包含了源文件路径,导致在构建时将其过滤掉了,即使目录存在也会报错找不到。

    如图为构建过程中加载 .dockerignore 文件:

    image

云效镜像执行apt-get update报错bullseye-backports Release 404 Not Found

相关背景

使用云效流水线执行apt-get update的解决方案

image

解决方案

报错是由于debian的镜像版本过低,目前debian12可以正常使用update命令。建议优先考虑更换高版本的镜像。

1.在指定容器环境中执行update报错

方案一:

  1. 可以查看Flow System Images,更换成更高debian版本的镜像。调整步骤如下:

    1. 找到构建环境中的“容器镜像地址”一栏,点击“直接输入”

    2. 输入需要使用的镜像地址

    3. image

    4. image

方案二:

自行构建更高版本的debian基础镜像,或者低版本debian自行安装依赖。然后提供给流水线运行(参考方案一中的步骤c、d)。