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

如何通过Alpine Linux优化基于Fedora的Docker镜像体积?

问题

我正尝试尽可能减小Docker镜像的体积,当前Dockerfile内容如下:

ARG DISTRO=fedora
ARG FEDORA_VERSION=36

FROM ${DISTRO}:${FEDORA_VERSION} AS dev

#Toolchain
RUN dnf -y install \
        gcc gcc-c++ \
        pkgconfig \
        cmake make \
        autoconf automake autogen libtool \
        flex bison \
        git rpm-build

#Dependencies
RUN dnf -y install \
        openssl-devel \
        #libuuid-devel \
        libcurl-devel \
        jansson-devel \
        spdlog-devel \
        fmt-devel \
        libconfig-devel \
        libusb-devel \
        lua-devel \
        libnice-devel \
        libwebsockets-devel

# Add local and 64-bit locations to linker paths
RUN echo /usr/local/lib   >> /etc/ld.so.conf && \
        echo /usr/local/lib64 >> /etc/ld.so.conf

ADD packaging/deps.sh / 
RUN bash deps.sh

EXPOSE 80
EXPOSE 443

ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8

FROM dev AS builder

ARG FLAGS

# Disable all default features
RUN FLAGS+=" -DWITH_DEFAULTS=OFF" && \
# Enable the villas-* binaries from ./src again
    FLAGS+=" -DWITH_SRC=ON" && \
# Enable the villas-* tools from ./tools again
    FLAGS+=" -DWITH_TOOLS=ON" && \
# Enable libconfig configuration syntax
    FLAGS+=" -DWITH_CONFIG=ON" && \
# Enable the nodes
    FLAGS+=" -DWITH_NODE_TEST_RTT=ON" && \
    FLAGS+=" -DWITH_NODE_WEBRTC=ON" && \
    FLAGS+=" -DWITH_NODE_SIGNAL=ON" && \
# Enable hooks, in&out support
    FLAGS+=" -DWITH_IN=ON" && \
    FLAGS+=" -DWITH_HOOKS=ON" && \
    FLAGS+=" -DWITH_OUT=ON"


COPY . /villas/

WORKDIR /villas/build
RUN cmake ${FLAGS} -S .. && \
    make -j$(nproc) install && \
    ldconfig


ENTRYPOINT ["villas"]

目前我已尝试减少依赖项、合并镜像层,但发现依赖无法再精简(删除任一依赖都会导致构建失败),且合并层的优化效果有限。我尝试使用Alpine Linux基础镜像来缩小体积,但直接在COPY指令前添加FROM alpine:latest的方式无法完成构建,请问针对我的场景,使用Alpine Linux减小镜像体积的正确方法是什么?

解决方案

不能直接在原有Fedora构建流程中插入Alpine镜像,需要基于Alpine的生态(包管理、libc类型)重构完整的多阶段构建流程,核心思路是分离编译环境与运行环境,用Alpine完成编译后,仅将必要的运行文件复制到干净的Alpine镜像中。

适配后的Dockerfile示例

# 第一阶段:构建环境 - 使用Alpine作为编译基础
ARG ALPINE_VERSION=3.18
FROM alpine:${ALPINE_VERSION} AS builder

# 安装编译工具链与依赖(注意Alpine包名后缀为-dev,与Fedora的-devel不同)
RUN apk add --no-cache \
    bash \
    gcc g++ \
    pkgconfig \
    cmake make \
    autoconf automake libtool \
    flex bison \
    git \
    openssl-dev \
    curl-dev \
    jansson-dev \
    spdlog-dev \
    fmt-dev \
    libconfig-dev \
    libusb-dev \
    lua-dev \
    libnice-dev \
    libwebsockets-dev

# 配置musl链接器路径(Alpine使用musl libc,而非Fedora的glibc)
RUN echo "/usr/local/lib" >> /etc/ld-musl-x86_64.conf && \
    echo "/usr/local/lib64" >> /etc/ld-musl-x86_64.conf

# 执行依赖脚本(需确保deps.sh适配Alpine,比如替换dnf为apk,或编译逻辑兼容musl)
ADD packaging/deps.sh /
RUN bash deps.sh

# 设置环境变量
ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8

# 复制项目源码并编译
ARG FLAGS
COPY . /villas/
WORKDIR /villas/build
RUN FLAGS+=" -DWITH_DEFAULTS=OFF \
    -DWITH_SRC=ON \
    -DWITH_TOOLS=ON \
    -DWITH_CONFIG=ON \
    -DWITH_NODE_TEST_RTT=ON \
    -DWITH_NODE_WEBRTC=ON \
    -DWITH_NODE_SIGNAL=ON \
    -DWITH_IN=ON \
    -DWITH_HOOKS=ON \
    -DWITH_OUT=ON" && \
    cmake ${FLAGS} -S .. && \
    make -j$(nproc) install && \
    ldconfig

# 第二阶段:运行环境 - 使用干净的Alpine镜像,仅保留必要文件
FROM alpine:${ALPINE_VERSION} AS runtime

# 仅安装运行时依赖(去除编译阶段的工具链)
RUN apk add --no-cache \
    openssl \
    curl \
    jansson \
    spdlog \
    fmt \
    libconfig \
    libusb \
    lua \
    libnice \
    libwebsockets \
    libstdc++

# 从构建阶段复制编译好的二进制与依赖库
COPY --from=builder /usr/local/bin/villas /usr/local/bin/
COPY --from=builder /usr/local/lib /usr/local/lib
COPY --from=builder /usr/local/lib64 /usr/local/lib64

# 配置运行时链接器路径
RUN echo "/usr/local/lib" >> /etc/ld-musl-x86_64.conf && \
    echo "/usr/local/lib64" >> /etc/ld-musl-x86_64.conf && \
    ldconfig

# 暴露端口
EXPOSE 80 443

# 设置入口点
ENTRYPOINT ["villas"]

关键注意事项

  1. 包名适配:Alpine的开发包后缀为-dev(如openssl-dev对应Fedora的openssl-devel),部分包名可能有差异,需提前确认Alpine包仓库的对应关系。
  2. musl兼容性:如果项目依赖glibc特定功能,需调整代码或安装gcompat包做兼容。
  3. 脚本适配:若deps.sh中有Fedora专属命令(如dnf),需替换为Alpine的apk命令;若涉及源码编译,需确保编译流程兼容musl环境。
  4. 运行时依赖精简:可通过ldd /usr/local/bin/villas查看二进制依赖的库,仅安装这些库进一步缩小体积。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:47:10