镜像构建诊断

诊断分析提供了构建诊断功能,帮助您识别镜像构建过程中出现的异常、潜在风险和优化项。本文将介绍构建诊断的检查项及相应的修复方案。

镜像构建诊断概述

镜像构建诊断功能结合了专家经验和通义千问大模型的能力,形成一种基于专家知识和人工智能的双重诊断模式,旨在深入定位问题根因并提供修改建议。

重要

使用镜像构建诊断功能时,将采集您的容器镜像仓库实例的相关数据信息,采集的信息包括镜像仓库实例信息、镜像构建配置信息、构建任务的日志信息和镜像构建历史记录。请勿将您的敏感数据存储在镜像构建配置或输出至构建任务日志中。详情请参见使用须知

诊断功能包含两个主要部分:

  • 规则检测:主要包括指令检查和错误日志分析。

  • 诊断根因:包括定位到的根因以及修复建议。

    通过收集容器镜像仓库实例的相关数据并识别异常情况,进行深入的异常诊断以确定问题的根源并提出相应的解决方案。

诊断流程

镜像构建诊断先收集容器镜像仓库实例所需的相关数据后,然后进行深入的异常诊断。发起诊断后,诊断流程分为三个阶段:

  • 数据预处理:采集诊断所需数据,例如实例状态、仓库配置、构建规则信息、构建日志等并快速分析构建存在的异常。

  • 规则检测:根据采集到的数据,分析构建中存在的异常、潜在的风险项和可优化项。

  • 根因分析:根据采集的数据和检测项,自动分析导致问题的原因和修复建议。

image

诊断结果

诊断结果包括两部分:

  • 待修复项:包括异常根因、修复建议和异常定位。

  • AI智能诊断:根据异常详情,对构建指令或配置项进行深入分析,提供更全面的优化建议。

查看诊断规则及修复建议

  1. 镜像构建诊断页面,单击诊断。然后在选择构建镜像任务页面,通过以下参数选择需要诊断的镜像构建任务ID。

    • 命名空间:镜像构建任务所属的命名空间。

    • 镜像仓库:镜像构建任务所属的镜像仓库。

    • 镜像构建任务ID:镜像构建任务ID号。

    选择完成后,仔细阅读注意事项后勾选我已知晓并同意,然后单击发起诊断

  2. 诊断完成后,您可以根据页面上的修复建议进行相应操作。以下是常见的诊断规则、异常根因及修复建议。

    诊断规则组

    诊断规则名称

    异常根因

    修复建议

    Dockerfile语法检测

    非法端口定义

    EXPOSE指令的端口或协议格式不正确。

    使用EXPOSE暴露端口时,端口范围应在0~65535,协议为TCPUDP。

    拷贝指令语法检测

    拷贝多个文件时,目的地址不是目录。

    确保目的路径格式为目录地址。

    构建阶段不存在

    COPY指定的阶段名不存在。

    确保阶段名是之前定义的阶段。

    重复的阶段名称

    使用了重复的阶段名。

    避免使用重复的阶段名。

    首条指令不合法

    首条指令不为FROMARG指令。

    确保首条指令为FROMARG指令。

    编译错误项

    Dockerfile预编译错误。

    请修正Dockerfile中的语法错误,或等待根因分析给出修改意见。

    编译警告项

    Dockerfile预编译警告。

    请注意Dockerfile中的相关指令,可能会以非预期的方式运行。

    镜像版本检测

    未指定基础镜像版本

    未指定明确的镜像版本。

    可能会导致构建时使用非预期的镜像版本,从而影响构建结果,建议指定明确的镜像版本。

    基础镜像不存在

    基础镜像名称有误或不存在。

    检查基础镜像名称或重新选择一个存在的基础镜像。

    运行阶段错误检测

    命令运行错误

    命令行运行错误。

    请检查在Dockerfile中指定运行的命令是否正确,或等待根因分析给出的修复建议。

    命令不存在

    运行的命令不存在。

    请确保基础镜像中存在Dockerfile中指定的运行命令。

    文件不存在

    文件拷贝错误。

    请检查DockerfileCOPY命令对应的文件或目录是否存在。

    非法指令检测

    非法命令检测

    在构建过程中使用了KillShutdown等不支持的指令。

    在构建过程中使用KillShutdown等指令会导致安全及稳定性问题,需要去除相关指令。

    sudo命令检测

    在构建中使用sudo命令是无效的。

    去除构建中的sudo指令。

    上传阶段错误检测

    版本冲突

    镜像版本与仓库已有镜像版本冲突。

    镜像版本冲突,请关闭仓库的镜像版本不可变功能,或确保相同版本的镜像不会被重复推送。

    镜像体积优化项检测

    apt get指令可优化项

    构建指令中的apt updateapt install指令分离。

    apt updateapt install指令分散在不同指令中可能会导致镜像体积增大,重复构建效率降低。

    apt get指令可优化项

    apt-get install未添加--no-install-recommends参数。

    使用apt-get install时加入--no-install-recommends参数有助于减小镜像体积。

    包安装指令可优化项

    安装软件包后未清除缓存。

    在安装软件包后清除缓存有助于减小镜像体积,如Ubuntu使用apt-get clean指令,Alpineapk add指令中加入--no-cacherm -rf /var/cache/apk/*指令,CentOS使用yum clean指令。

    分阶段编译检测

    未使用多阶段构建优化编译指令。

    将编译指令放入单独的阶段进行编译,将编译结果拷贝进入业务镜像,可以缩小镜像体积。

    存在冗余压缩包

    构建使用的压缩包未清除。

    将下载压缩包、解压压缩包和删除压缩包指令合并在同一条RUN指令中执行,可缩小镜像体积。

    构建指令优化检测

    相对路径检测

    WORKDIR使用相对路径。

    使用相对路径时,可能会切换到非预期的工作目录,导致构建失败,建议确认WORKDIR路径是否正确或使用绝对路径。

    根用户检测

    在构建中切换到Root用户。

    在构建中切换到Root用户,会导致容器在运行时存在安全性问题,需要去除相关指令。

    路径切换优化检测

    在构建过程中使用cd指令。

    在构建中使用cd指令指定工作目录不会在容器运行时生效,推荐使用WORKDIR指令。

    CMDENTRYPOINT覆盖检测

    在构建过程中使用多条CMD指令或ENTRYPOINT指令。

    使用多条CMDENTRYPOINT指令时只有最后一条指令会生效,确保最后一条指令为预期使用的指令。