# 架构参数:可选值 x86_64 或 aarch64 ARG TARGETARCH=x86_64 FROM ubuntu:24.04 AS builder ARG TARGETARCH # 跳过 GPG 签名验证(兼容 BM1684 等系统时间不准的设备) RUN apt-get update -o Acquire::AllowInsecureRepositories=yes \ -o Acquire::AllowDowngradeToInsecureRepositories=yes \ --allow-unauthenticated 2>/dev/null || true && \ apt-get install -y --no-install-recommends \ -o Acquire::AllowInsecureRepositories=yes \ --allow-unauthenticated \ ca-certificates tzdata 2>/dev/null || true && \ rm -rf /var/lib/apt/lists/* COPY build/chongming /tmp/chongming # 构建最小 rootfs RUN \ if [ "$TARGETARCH" = "aarch64" ]; then \ LIB_PATH="/lib/aarch64-linux-gnu"; \ LD_LINKER="/lib/ld-linux-aarch64.so.1"; \ LD_LINKER_TARGET="/tmp/rootfs/lib/ld-linux-aarch64.so.1"; \ GCC_LIB_PATH="/lib/aarch64-linux-gnu"; \ GCC_USR_PATH="/usr/lib/aarch64-linux-gnu"; \ else \ LIB_PATH="/lib/x86_64-linux-gnu"; \ LD_LINKER="/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2"; \ LD_LINKER_TARGET="/tmp/rootfs/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2"; \ GCC_LIB_PATH="/lib/x86_64-linux-gnu"; \ GCC_USR_PATH="/usr/lib/x86_64-linux-gnu"; \ fi && \ mkdir -p /tmp/rootfs/app && \ mkdir -p /tmp/rootfs/tmp && chmod 1777 /tmp/rootfs/tmp && \ mkdir -p /tmp/rootfs/app/data && chmod 777 /tmp/rootfs/app/data && \ # === aarch64 链接器路径特殊处理 === if [ "$TARGETARCH" = "aarch64" ]; then \ mkdir -p /tmp/rootfs/lib && \ cp /lib/ld-linux-aarch64.so.1 /tmp/rootfs/lib/ && \ mkdir -p /tmp/rootfs/lib64 && \ ln -s /lib/ld-linux-aarch64.so.1 /tmp/rootfs/lib64/ld-linux-aarch64.so.1; \ else \ mkdir -p /tmp/rootfs/lib64 && \ mkdir -p /tmp/rootfs${LIB_PATH} && \ cp ${LIB_PATH}/ld-linux-x86-64.so.2 /tmp/rootfs${LIB_PATH}/ && \ ln -s ${LIB_PATH}/ld-linux-x86-64.so.2 /tmp/rootfs/lib64/ld-linux-x86-64.so.2; \ fi && \ # === 基础依赖库 === mkdir -p /tmp/rootfs${LIB_PATH} && \ cp ${LIB_PATH}/libdl.so.2 /tmp/rootfs${LIB_PATH}/ && \ cp ${LIB_PATH}/libz.so.1 /tmp/rootfs${LIB_PATH}/ && \ cp ${LIB_PATH}/libpthread.so.0 /tmp/rootfs${LIB_PATH}/ && \ cp ${LIB_PATH}/libc.so.6 /tmp/rootfs${LIB_PATH}/ && \ cp ${LIB_PATH}/librt.so.1 /tmp/rootfs${LIB_PATH}/ && \ cp ${LIB_PATH}/libm.so.6 /tmp/rootfs${LIB_PATH}/ && \ cp ${LIB_PATH}/libutil.so.1 /tmp/rootfs${LIB_PATH}/ && \ cp ${LIB_PATH}/libnss_dns.so.2 /tmp/rootfs${LIB_PATH}/ 2>/dev/null || true && \ cp ${LIB_PATH}/libnss_files.so.2 /tmp/rootfs${LIB_PATH}/ 2>/dev/null || true && \ cp ${LIB_PATH}/libresolv.so.2 /tmp/rootfs${LIB_PATH}/ 2>/dev/null || true && \ # === Nuitka 额外需要的 GCC 运行时库 === mkdir -p /tmp/rootfs${GCC_LIB_PATH} && \ mkdir -p /tmp/rootfs${GCC_USR_PATH} && \ cp ${GCC_LIB_PATH}/libgcc_s.so.1 /tmp/rootfs${GCC_LIB_PATH}/ && \ cp ${GCC_USR_PATH}/libstdc++.so.6 /tmp/rootfs${GCC_USR_PATH}/ 2>/dev/null || true && \ # === 时区数据 === mkdir -p /tmp/rootfs/usr/share/zoneinfo && \ cp -r /usr/share/zoneinfo/Asia /tmp/rootfs/usr/share/zoneinfo/ 2>/dev/null || true && \ cp /usr/share/zoneinfo/UTC /tmp/rootfs/usr/share/zoneinfo/ 2>/dev/null || true && \ # === 证书和 DNS === mkdir -p /tmp/rootfs/etc/ssl/certs && \ cp /etc/ssl/certs/ca-certificates.crt /tmp/rootfs/etc/ssl/certs/ 2>/dev/null || true && \ echo "hosts: files dns" > /tmp/rootfs/etc/nsswitch.conf && \ # === /proc /sys /dev === mkdir -p /tmp/rootfs/proc /tmp/rootfs/sys /tmp/rootfs/dev FROM scratch ENV PYTHONIOENCODING=utf-8 ENV LANG=C.UTF-8 ARG TARGETARCH COPY --from=builder /tmp/rootfs/ / COPY build/chongming /app/chongming COPY build/config.toml /app/config.toml COPY build/resources/ /app/resources/ COPY build/static.svfs /app/static.svfs COPY build/data /app/data WORKDIR /app EXPOSE 8000 CMD ["./chongming"]