多阶段构建Redis镜像后,Syft生成的SBOM未包含Redis组件
多阶段构建Redis镜像后Syft扫描未识别Redis二进制文件的问题
我通过多阶段构建创建Redis的Docker镜像,最终阶段使用distroless静态镜像,流程为静态编译Redis后复制二进制文件。但执行syft <image> --scope all-layers后,生成的SBOM中未显示Redis二进制文件。以下是我的Dockerfile及Syft扫描输出,请问遗漏了什么配置?
# Stage 1: Build Redis as a fully static binary FROM alpine:latest AS builder WORKDIR /usr/src/redis # Install dependencies for static build (including OpenSSL for TLS) RUN apk add --no-cache build-base linux-headers musl-dev wget \ openssl-dev openssl-libs-static iputils-ping busybox bash # Download and compile Redis with static linking and TLS-enabled for amd64 ARG REDIS_VERSION=7.4.2 RUN wget http://download.redis.io/releases/redis-${REDIS_VERSION}.tar.gz && \ tar xzf redis-${REDIS_VERSION}.tar.gz && \ cd redis-${REDIS_VERSION} && \ make LDFLAGS="-static -L/usr/lib -lssl -lcrypto" CFLAGS="-march=x86-64" BUILD_TLS=yes # Stage 2: Copy static binaries to distroless FROM gcr.io/distroless/static-debian12 # Set working directory WORKDIR /data # Copy Redis binaries COPY --from=builder /usr/src/redis/redis-7.4.2/src/redis-server /usr/local/bin/redis-server COPY --from=builder /usr/src/redis/redis-7.4.2/src/redis-cli /usr/local/bin/redis-cli # Expose Redis port EXPOSE 6379 EXPOSE 16379 # Run Redis ENTRYPOINT ["/usr/local/bin/redis-server"]
Syft扫描输出:
syft scan test:latest ✔ Loaded image test:latest ✔ Parsed image ✔ Cataloged contents ├── ✔ Packages [0 packages] ├── ✔ File digests [2 files] ├── ✔ File metadata [2 locations] └── ✔ Executables [11 executables]
问题原因与解决方法
Syft默认的「Packages」分类仅识别包管理器(如apt、apk等)安装的软件包,而你是手动编译后直接复制的二进制文件,不属于任何包管理系统的包,因此不会出现在「Packages」列表中。但从扫描输出可以看到,Syft已经捕获到了相关文件和可执行文件。
查看已识别的Redis可执行文件
执行更详细的扫描命令,查看Executables分类下的具体内容:syft scan test:latest --output table --scope all-layers该命令会列出所有可执行文件的路径、哈希、架构等信息,其中包含
redis-server和redis-cli。你也可以用JSON输出过滤查看:syft scan test:latest --scope all-layers --output json | jq '.artifacts[] | select(.name | contains("redis"))'确认静态二进制编译正确性
先验证Redis二进制的版本和静态链接状态:# 查看Redis版本 docker run --rm test:latest /usr/local/bin/redis-server --version # 检查是否为静态链接 docker run --rm --entrypoint sh alpine:latest -c "docker save test:latest | tar -xO usr/local/bin/redis-server | file -"若输出包含
statically linked,则编译符合要求。将Redis二进制标记为“包”(可选)
如果需要让Redis出现在「Packages」列表中,可通过以下方式实现:- 在Dockerfile中添加LABEL,补充包元数据(Syft会读取部分镜像标签作为包信息);
- 使用Syft的自定义配置文件,手动定义该二进制的包属性(如名称、版本、类型等)。
内容的提问来源于stack exchange,提问作者user782400
相关产品推荐
相关产品推荐

