诊断分析提供了构建诊断功能,帮助您识别镜像构建过程中出现的异常、潜在风险和优化项。本文将介绍构建诊断的检查项及相应的修复方案。
镜像构建诊断概述
镜像构建诊断功能结合了专家经验和通义千问大模型的能力,形成一种基于专家知识和人工智能的双重诊断模式,旨在深入定位问题根因并提供修改建议。
使用镜像构建诊断功能时,将采集您的容器镜像仓库实例的相关数据信息,采集的信息包括镜像仓库实例信息、镜像构建配置信息、构建任务的日志信息和镜像构建历史记录。请勿将您的敏感数据存储在镜像构建配置或输出至构建任务日志中。详情请参见使用须知。
诊断功能包含两个主要部分:
规则检测:主要包括指令检查和错误日志分析。
诊断根因:包括定位到的根因以及修复建议。
通过收集容器镜像仓库实例的相关数据并识别异常情况,进行深入的异常诊断以确定问题的根源并提出相应的解决方案。
诊断流程
镜像构建诊断先收集容器镜像仓库实例所需的相关数据后,然后进行深入的异常诊断。发起诊断后,诊断流程分为三个阶段:
数据预处理:采集诊断所需数据,例如实例状态、仓库配置、构建规则信息、构建日志等并快速分析构建存在的异常。
规则检测:根据采集到的数据,分析构建中存在的异常、潜在的风险项和可优化项。
根因分析:根据采集的数据和检测项,自动分析导致问题的原因和修复建议。
诊断结果
诊断结果包括两部分:
待修复项:包括异常根因、修复建议和异常定位。
AI智能诊断:根据异常详情,对构建指令或配置项进行深入分析,提供更全面的优化建议。
查看诊断规则及修复建议
在镜像构建诊断页面,单击诊断。然后在选择构建镜像任务页面,通过以下参数选择需要诊断的镜像构建任务ID。
命名空间:镜像构建任务所属的命名空间。
镜像仓库:镜像构建任务所属的镜像仓库。
镜像构建任务ID:镜像构建任务ID号。
选择完成后,仔细阅读注意事项后勾选我已知晓并同意,然后单击发起诊断。
诊断完成后,您可以根据页面上的修复建议进行相应操作。以下是常见的诊断规则、异常根因及修复建议。
诊断规则组
诊断规则名称
异常根因
修复建议
Dockerfile语法检测
非法端口定义
EXPOSE
指令的端口或协议格式不正确。使用
EXPOSE
暴露端口时,端口范围应在0~65535,协议为TCP或UDP。拷贝指令语法检测
拷贝多个文件时,目的地址不是目录。
确保目的路径格式为目录地址。
构建阶段不存在
COPY
指定的阶段名不存在。确保阶段名是之前定义的阶段。
重复的阶段名称
使用了重复的阶段名。
避免使用重复的阶段名。
首条指令不合法
首条指令不为
FROM
或ARG
指令。确保首条指令为
FROM
或ARG
指令。编译错误项
Dockerfile预编译错误。
请修正Dockerfile中的语法错误,或等待根因分析给出修改意见。
编译警告项
Dockerfile预编译警告。
请注意Dockerfile中的相关指令,可能会以非预期的方式运行。
镜像版本检测
未指定基础镜像版本
未指定明确的镜像版本。
可能会导致构建时使用非预期的镜像版本,从而影响构建结果,建议指定明确的镜像版本。
基础镜像不存在
基础镜像名称有误或不存在。
检查基础镜像名称或重新选择一个存在的基础镜像。
运行阶段错误检测
命令运行错误
命令行运行错误。
请检查在Dockerfile中指定运行的命令是否正确,或等待根因分析给出的修复建议。
命令不存在
运行的命令不存在。
请确保基础镜像中存在Dockerfile中指定的运行命令。
文件不存在
文件拷贝错误。
请检查Dockerfile中
COPY
命令对应的文件或目录是否存在。非法指令检测
非法命令检测
在构建过程中使用了
Kill
、Shutdown
等不支持的指令。在构建过程中使用
Kill
、Shutdown
等指令会导致安全及稳定性问题,需要去除相关指令。sudo命令检测
在构建中使用
sudo
命令是无效的。去除构建中的
sudo
指令。上传阶段错误检测
版本冲突
镜像版本与仓库已有镜像版本冲突。
镜像版本冲突,请关闭仓库的镜像版本不可变功能,或确保相同版本的镜像不会被重复推送。
镜像体积优化项检测
apt get
指令可优化项构建指令中的
apt update
和apt install
指令分离。apt update
与apt install
指令分散在不同指令中可能会导致镜像体积增大,重复构建效率降低。apt get
指令可优化项apt-get install
未添加--no-install-recommends
参数。使用
apt-get install
时加入--no-install-recommends
参数有助于减小镜像体积。包安装指令可优化项
安装软件包后未清除缓存。
在安装软件包后清除缓存有助于减小镜像体积,如Ubuntu使用
apt-get clean
指令,Alpine在apk add
指令中加入--no-cache和rm -rf /var/cache/apk/*
指令,CentOS使用yum clean
指令。分阶段编译检测
未使用多阶段构建优化编译指令。
将编译指令放入单独的阶段进行编译,将编译结果拷贝进入业务镜像,可以缩小镜像体积。
存在冗余压缩包
构建使用的压缩包未清除。
将下载压缩包、解压压缩包和删除压缩包指令合并在同一条
RUN
指令中执行,可缩小镜像体积。构建指令优化检测
相对路径检测
WORKDIR
使用相对路径。使用相对路径时,可能会切换到非预期的工作目录,导致构建失败,建议确认
WORKDIR
路径是否正确或使用绝对路径。根用户检测
在构建中切换到Root用户。
在构建中切换到Root用户,会导致容器在运行时存在安全性问题,需要去除相关指令。
路径切换优化检测
在构建过程中使用
cd
指令。在构建中使用
cd
指令指定工作目录不会在容器运行时生效,推荐使用WORKDIR
指令。CMD
、ENTRYPOINT
覆盖检测在构建过程中使用多条
CMD
指令或ENTRYPOINT
指令。使用多条
CMD
或ENTRYPOINT
指令时只有最后一条指令会生效,确保最后一条指令为预期使用的指令。