You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多阶段构建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已经捕获到了相关文件和可执行文件。

  1. 查看已识别的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"))'
    
  2. 确认静态二进制编译正确性
    先验证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,则编译符合要求。

  3. 将Redis二进制标记为“包”(可选)
    如果需要让Redis出现在「Packages」列表中,可通过以下方式实现:

    • 在Dockerfile中添加LABEL,补充包元数据(Syft会读取部分镜像标签作为包信息);
    • 使用Syft的自定义配置文件,手动定义该二进制的包属性(如名称、版本、类型等)。

内容的提问来源于stack exchange,提问作者user782400

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 02:10:08