容器镜像服务ACR针对企业版实例运行的构建任务,提供了Dockerfile优化推荐功能,可以帮助您找出Dockerfile中的潜在问题,以提高容器镜像的质量。该功能不会对镜像构建功能产生任何影响,并且您无需进行任何操作,就可以在构建日志中查看优化推荐的结果。本文介绍如何根据Dockerfile优化推荐的结果找出Dockerfile中的潜在问题,以进一步提高容器镜像的质量,满足企业级应用的需求。
背景信息
使用企业版构建服务,容器镜像服务可以在镜像构建前自动对构建的Dockerfile进行优化推荐。优化推荐功能会根据语法规则以及最优实践规则进行分析,最后输出分析结果。关于语法规则的更多内容,请参见官方语法规则。
分析结果分为Error和Warning两种等级:
Error:Dockerfile中存在语法错误或容器镜像服务不支持的构建参数,此类问题将导致镜像构建出错,需要进行改正。
Warning:Dockerfile中存在潜在问题,可能导致构建产生非预期的结果或者镜像存在冗余数据。
分析结果格式
语法检测结果
[Error] <Error message> at line <line number>: <Specific instruction content>
[Warning] <Warning message> at line <line number>: <Specific instruction content>
[Error] [Rule <Rule id>] <Error message> at line <line number>: <Specific instruction content>
[Warning] [Rule <Rule id>] <Warning message> at line <line number>: <Specific instruction content>
示例1
存在语法错误的Dockerfile。
# FROM指令使用了不支持的架构的基础镜像,并且没有指定多阶段构建的名称
FROM --platform=windows alpine as
# RUN指令使用了不支持的运行参数
RUN --security=insecure cat /proc/self/status | grep CapEff
# ADD指令缺少目的路径
ADD https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz
# COPY指令不支持拷贝远程文件
COPY https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz linux-0.01.tag.gz
# COPY/ADD拷贝的源文件路径在构建路径下不存在
COPY <不存在的路径> /somedir/
# 错误的指令名称
CPY /foo /bar
语法检测结果输出。
[parse stage begin.]
[Error] Unsupported target architecture at line 2: windows.
[Error] Lack of stage name at line 2.
[Error] Unsupported security mode at line 4: insecure.
[Error] Lack of dest at line 6.
[Error] COPY does not support remote links. Please use the ADD instruction at line 8: https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz.
[Error] Source path is not exist at line 10: <不存在的路径>.
[Error] Unknown instruction at line 12: CPY.
[Warning] No tag specified at line 2: from ["--platform=windows"] "alpine" "as".
[parse successfully, takes 0s.]
示例2
违背了最优实践规则的Dockerfile。
# 未指定镜像版本
FROM alpine AS a
# 安装软件包后未清除缓存
RUN apk add gcc
# 未指定镜像版本,使用了已有的阶段名
from ubuntu as a
# 安装软件包后未清除缓存,未使用--no-install-recommends避免下载不必要的软件包
RUN apt-get install -y gcc
语法检测结果输出。
[parse stage begin.]
[Warning] [Rule1003]When installing software with apt-get, it is recommended to include the --no-install-recommends parameter at line 8: RUN apt-get install -y gcc .
[Warning] No tag specified at line 2: FROM alpine AS a .
[Warning] No tag specified at line 6: from ubuntu as a .
[Warning] [Rule1001]Using a base image with a specific tag instead of the latest image.
[Error] Duplicate stage names with line 2: a at line 6: from ubuntu as a .
[Error] [Rule1014]Do not use duplicate stage names.
[parse successfully, takes 0s.]
检测规则
最优实践规则
规则编号 | 提示等级 | 构建规则 | 推荐操作 |
R1001 | Warning | 基础镜像避免使用Latest标签镜像。 | 为您的基础镜像指定特定版本的镜像。 |
R1002 | Warning | 避免将 | 将 |
R1003 | Warning | 使用 | 在 |
R1004 | Warning | 下载安装包后清空缓存,可以缩小镜像体积。 |
|
R1005 | Warning | 使用多阶段构建处理编译命令,可以缩小镜像体积。 | 对于make、go build等指令,将其放入单独的阶段进行编译,将编译结果拷贝进入业务镜像,如:
|
R1006 | Warning | WORKDIR指定工作目录时,使用相对路径可能会导致使用的路径与预期不一致。 | 将相对路径改为绝对路径。 |
R1007 | Error | 在构建过程中使用Kill、Shutdown等指令会导致安全及稳定性问题。 | 去除相关指令。 |
R1008 | Warning | 在构建中使用Root用户,会导致容器在运行时存在安全性问题。 | 避免使用Root用户。 |
R1009 | Warning | 在构建中使用CD指令指定工作目录不会在容器运行时生效。 | 使用WORKDIR指令代替CD命令。 |
R1010 | Error | 在构建中使用Sudo命令是无效的。 | 去除sudo指令。 |
R1011 | Error | 使用EXPOSE暴露端口时,端口范围应在0~65535,协议为TCP或UDP。 | 使用合法的EXPOSE参数,如:8080,8081/tcp,8082/udp。 |
R1012 | Error | 使用COPY指令拷贝多个源文件时,目的路径应为目录。 | 确保目的路径格式为目录地址。 |
R1013 | Error | 使用COPY指令从其他构建阶段拷贝文件时,需要使用正确的阶段名。 | 确保阶段名是之前定义的阶段。 |
R1014 | Error | 使用多阶段构建时,阶段名不能重复。 | 避免使用重复的阶段名。 |
R1015 | Error | Dockerfile中的首条指令应为FROM或ARG指令。 | 确保首条指令为FROM或ARG指令。 |
R1016 | Warning | 使用多条CMD指令时只有最后一条CMD指令会生效。 | 确保最后一条CMD指令为预期使用的指令。 |
R1017 | Warning | 使用多条ENTRYPOINT指令时只有最后一条ENTRYPOINT指令会生效。 | 确保最后一条ENTRYPOINT指令为预期使用的指令。 |
R1018 | Error | 使用ADD指令拷贝多个源文件时,目的路径格式应为目录地址。 | 确保目的路径格式为目录地址。 |
R1019 | Warning | 在解压之后删除压缩包,可缩小镜像体积。 | 将下载压缩包、解压压缩包和删除压缩包指令合并在同一条RUN指令中执行。 |