← 返回

信创实战:Dockerfile 信创基础镜像构建

系列:信创国产化适配 | 作者:lin | 日期:2026-05-15


一、背景与问题

1.1 为什么信创环境需要自定义 Docker 镜像

在信创国产化落地过程中,Docker 容器化部署是标配。但直接使用官方镜像会遇到以下问题:

  1. 架构不匹配:官方 Docker Hub 上的 OpenJDK 镜像主要提供 amd64aarch64,缺少申威 sw64、龙芯 loongarch64 等国产架构
  2. OS 不兼容:信创环境通常要求使用国产操作系统(麒麟、统信),而官方镜像基于 Debian/Ubuntu
  3. 安全合规:信创项目通常要求使用经过安全审计的基础镜像,不能直接拉取公网镜像
  4. 定制需求:需要预装特定工具、配置国内镜像源、设置时区和 Locale 等

1.2 基础镜像选型对比

镜像体积包管理国产 CPU 支持适用场景
Alpine 3.20~5MBapk仅 x86/arm64(申威/龙芯需基于国产OS)追求极致精简
Ubuntu 22.04~77MBapt较好需要 glibc 环境
麒麟 V10~200MByum/dnf原生支持信创验收要求
统信 UOS~200MBapt原生支持信创验收要求
Amazon Corretto基于 Alpineapk官方多架构生产推荐
镜像选型建议
鲲鹏 ARM64:直接使用 Amazon Corretto 官方多架构镜像。申威 SW64 / 龙芯 LoongArch:Alpine 官方不支持这两种架构,必须基于国产 OS(龙芯开源系统、统信 UOS、麒麟 V10 等)自行构建基础镜像。信创验收场景:基于麒麟/统信构建,满足安全审查要求。所有国产 CPU 环境都建议提前规划内部镜像仓库。

二、Amazon Corretto 8 JDK 镜像构建(Alpine 3.20)

2.1 完整 Dockerfile

# ============================================================
# 信创基础镜像:Amazon Corretto 8 JDK (Alpine 3.20)
# 支持架构:x86_64, aarch64(鲲鹏)
# 适用场景:Java 微服务基础运行环境
# ============================================================

FROM alpine:3.20

# ============================================================
# 镜像元信息
# ============================================================
LABEL maintainer="lin" \
      description="Amazon Corretto 8 JDK for xinchuang" \
      version="8u422" \
      architecture.multiarch="true"

# ============================================================
# 环境变量
# ============================================================
# Corretto 版本(可通过构建参数覆盖)
ARG CORRETTO_VERSION=8.422.05.1
ARG CORRETTO_SHA256_AMD64=a7b7e2f8c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0
ARG CORRETTO_SHA256_AARCH64=b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9

ENV JAVA_HOME=/usr/lib/jvm/java-1.8.0-amazon-corretto \
    PATH="/usr/lib/jvm/java-1.8.0-amazon-corretto/bin:${PATH}" \
    LANG=en_US.UTF-8 \
    LC_ALL=en_US.UTF-8 \
    TZ=Asia/Shanghai \
    # JVM 默认参数(可通过环境变量覆盖)
    JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Djava.security.egd=file:/dev/./urandom"

# ============================================================
# 安装基础依赖 + 配置国内镜像源
# ============================================================
# 使用阿里云镜像源加速(信创环境通常无法直接访问 dl-cdn.alpinelinux.org)
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
    apk add --no-cache \
        bash \
        curl \
        wget \
        tzdata \
        ca-certificates \
        fontconfig \
        ttf-dejavu \
        busybox-extras \
        procps \
        gzip \
        tar \
        zip \
        unzip \
    && rm -rf /var/cache/apk/*

# ============================================================
# 时区配置
# ============================================================
RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && \
    echo "${TZ}" > /etc/timezone

# ============================================================
# Locale 配置
# ============================================================
ENV LANG=en_US.UTF-8 \
    LANGUAGE=en_US:en \
    LC_ALL=en_US.UTF-8

# ============================================================
# 安装 Amazon Corretto 8 JDK
# ============================================================
RUN ARCH=$(uname -m) && \
    case "${ARCH}" in \
        x86_64)  CORRETTO_ARCH="x64" ;; \
        aarch64) CORRETTO_ARCH="aarch64" ;; \
        *)       echo "Unsupported architecture: ${ARCH}" && exit 1 ;; \
    esac && \
    wget -q -O /tmp/corretto.tar.gz \
        "https://corretto.aws/downloads/latest/amazon-corretto-${CORRETTO_VERSION}-linux-${CORRETTO_ARCH}-jdk.tar.gz" && \
    mkdir -p /usr/lib/jvm && \
    tar -xzf /tmp/corretto.tar.gz -C /usr/lib/jvm && \
    ln -sf /usr/lib/jvm/amazon-corretto-${CORRETTO_VERSION}-linux-${CORRETTO_ARCH} \
           /usr/lib/jvm/java-1.8.0-amazon-corretto && \
    rm -f /tmp/corretto.tar.gz && \
    java -version

# ============================================================
# 内置健康检查脚本:java-info
# ============================================================
RUN cat > /usr/local/bin/java-info << 'SCRIPT' && chmod +x /usr/local/bin/java-info
#!/bin/bash
echo "========================================="
echo "  Java Environment Info"
echo "========================================="
echo ""
echo "📦 JDK Version:"
java -version 2>&1
echo ""
echo "📁 JAVA_HOME: ${JAVA_HOME}"
echo "🏗️  Architecture: $(uname -m)"
echo "🐧 OS: $(cat /etc/os-release 2>/dev/null | grep PRETTY_NAME | cut -d= -f2 | tr -d '"')"
echo "🕐 Timezone: $(cat /etc/timezone 2>/dev/null || echo 'not set')"
echo ""
echo "💾 Memory:"
free -h 2>/dev/null || echo "  (free command not available)"
echo ""
echo "🔧 JVM System Properties (key ones):"
java -XshowSettings:all 2>&1 | grep -E "(java.home|os.arch|os.name|file.encoding|user.timezone)" | sed 's/^/  /'
echo ""
echo "========================================="
SCRIPT

WORKDIR /app
CMD ["bash"]

2.2 构建与使用

# 构建镜像(单架构)
docker build -t xinchuang/corretto8-jdk:8u422-alpine3.20 .

# 验证
docker run --rm xinchuang/corretto8-jdk:8u422-alpine3.20 java-info

三、Docker Buildx 多架构构建

3.1 Buildx 基础概念

Docker Buildx 是 Docker 的扩展构建工具,支持一次构建同时生成多架构镜像。在信创场景下,因此可以用一条命令同时构建 x86_64 和 ARM64 的镜像。

多架构镜像的体积公式:

Manifest 总大小 = 各架构 Layer Size 之和 + Manifest Overhead

其中 n 是目标架构数,每个架构有独立的层(layer)集合。

3.2 创建 Buildx Builder

# 创建支持多架构的 builder(使用 docker-container 驱动)
docker buildx create \
    --name xinchuang-builder \
    --driver docker-container \
    --driver-opt network=host \
    --bootstrap --use

# 查看已创建的 builder
docker buildx ls

# 安装 QEMU 用户态模拟(用于非本机架构的交叉编译)
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
Buildx 驱动选择
docker-container 驱动支持多平台构建,但镜像不会自动加载到本地 Docker Engine。多架构产物建议用 --push 直接推送到 Registry;本地调试单架构时再用 --load--output type=docker。如果使用 Docker Engine 29.0+ 并启用了 containerd image store,则原生支持多平台。

3.3 多架构构建命令

# 构建并推送多架构镜像到 Registry
docker buildx build \
    --platform linux/amd64,linux/arm64 \
    -t xinchuang.nexus.com/base/corretto8-jdk:8u422-alpine3.20 \
    --push .

# 本地调试建议只加载单架构镜像;经典 Docker image store 不能直接 load 多架构 manifest
docker buildx build \
    --platform linux/arm64 \
    -t xinchuang/corretto8-jdk:8u422-alpine3.20-arm64 \
    --load .

# 仅构建特定架构(调试用)
docker buildx build \
    --platform linux/arm64 \
    -t xinchuang/corretto8-jdk:8u422-alpine3.20-arm64 \
    --load .

3.4 多架构 Dockerfile 中的条件处理

# ============================================================
# 多架构自适应 Dockerfile
# 通过 ARG + 条件判断实现不同架构的差异化配置
# ============================================================

FROM alpine:3.20

ARG TARGETARCH  # Docker buildx 自动注入

# 根据架构设置不同的镜像源
RUN if [ "${TARGETARCH}" = "arm64" ]; then \
        # 鲲鹏 ARM64:使用华为云镜像源(速度更快)
        sed -i 's/dl-cdn.alpinelinux.org/repo.huaweicloud.com/g' /etc/apk/repositories; \
    elif [ "${TARGETARCH}" = "sw64" ]; then \
        # 申威:使用内部镜像源(通常无法访问公网)
        echo "http://internal-mirror.example.com/alpine/v3.20/main" > /etc/apk/repositories; \
    else \
        # x86_64:使用阿里云镜像源
        sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories; \
    fi
Buildx 构建缓存优化
使用 --cache-from--cache-to 可以将构建缓存存储在 Registry 或本地目录,显著加速多架构构建:docker buildx build --cache-from type=registry,ref=xinchuang.nexus.com/cache/corretto8 --cache-to type=registry,ref=xinchuang.nexus.com/cache/corretto8,mode=max --platform linux/amd64,linux/arm64 ...
申威/龙芯镜像源注意事项
申威和龙芯架构目前没有成熟的公网镜像源,信创项目必须提前规划内部镜像仓库搭建。建议在项目立项阶段就确认目标 CPU 架构的软件生态成熟度,包括:OS 安装介质获取渠道、JDK/JRE 预编译包来源、第三方依赖(如 Maven 本地仓库)的可用性等。

四、Amazon Corretto 8 JRE 镜像构建(精简版)

生产环境中,通常不需要完整的 JDK,JRE 足以运行 Java 应用。JRE 与 JDK 的镜像层大小对比:

JRE 节省 = JDK Size - JRE Size ≈ 150MB

节省比例 = (350 - 200) / 350 × 100% ≈ 43%

# ============================================================
# 信创精简镜像:Amazon Corretto 8 JRE (Alpine 3.20)
# 适用于:生产环境 Java 应用运行时
# ============================================================

FROM alpine:3.20

ARG CORRETTO_VERSION=8.422.05.1

ENV JAVA_HOME=/usr/lib/jvm/java-1.8.0-amazon-corretto-jre \
    PATH="/usr/lib/jvm/java-1.8.0-amazon-corretto-jre/bin:${PATH}" \
    LANG=en_US.UTF-8 \
    TZ=Asia/Shanghai \
    JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+UseStringDeduplication -Djava.security.egd=file:/dev/./urandom"

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
    apk add --no-cache bash curl tzdata ca-certificates fontconfig ttf-dejavu && \
    ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && \
    echo "${TZ}" > /etc/timezone

RUN ARCH=$(uname -m) && \
    case "${ARCH}" in \
        x86_64)  CORRETTO_ARCH="x64" ;; \
        aarch64) CORRETTO_ARCH="aarch64" ;; \
        *)       echo "Unsupported architecture: ${ARCH}" && exit 1 ;; \
    esac && \
    wget -q -O /tmp/corretto-jre.tar.gz \
        "https://corretto.aws/downloads/latest/amazon-corretto-${CORRETTO_VERSION}-linux-${CORRETTO_ARCH}-jre.tar.gz" && \
    mkdir -p /usr/lib/jvm && \
    tar -xzf /tmp/corretto-jre.tar.gz -C /usr/lib/jvm && \
    ln -sf /usr/lib/jvm/amazon-corretto-${CORRETTO_VERSION}-linux-${CORRETTO_ARCH}-jre \
           /usr/lib/jvm/java-1.8.0-amazon-corretto-jre && \
    rm -f /tmp/corretto-jre.tar.gz && \
    # 删除不必要的文件(进一步瘦身)
    rm -rf /usr/lib/jvm/*/lib/src.zip \
           /usr/lib/jvm/*/lib/missioncontrol \
           /usr/lib/jvm/*/lib/visualvm \
           /var/cache/apk/*

WORKDIR /app
CMD ["bash"]

镜像体积对比:

镜像类型大约体积说明
JDK(Alpine)~350MB含编译器、调试工具
JRE(Alpine)~200MB仅运行时
JRE + 瘦身~170MB删除 src.zip、VisualVM 等

五、多架构支持(x86_64、aarch64、sw_64)

5.1 国产 CPU 的镜像源配置

鲲鹏 ARM64(华为云源)

# 鲲鹏 ARM64 专用镜像源
RUN sed -i 's/dl-cdn.alpinelinux.org/repo.huaweicloud.com/g' /etc/apk/repositories

# 如果使用 Ubuntu 基础镜像
RUN sed -i 's|ports.ubuntu.com|mirrors.huaweicloud.com|g' /etc/apt/sources.list

龙芯 LoongArch(需自建本地源)

龙芯官方系统为 Loongnix / LoongOS,可从龙芯开源社区(www.loongnix.cn)获取 ISO 安装介质。但公网可访问的软件源非常有限,生产环境必须自建本地镜像源

# 龙芯 LoongArch 镜像源(指向自建本地源)
# 先从 www.loongnix.cn 下载 ISO,挂载后用 aptly 或 reprepro 导入为本地 apt 源
RUN echo "deb http://nexus.example.com/repos/loongnix/20.3/ fusco main" > /etc/apt/sources.list && \
    echo "deb http://nexus.example.com/repos/loongnix/20.3-updates/ fusco main" >> /etc/apt/sources.list

申威 SW64(需自建内部源)

申威平台没有任何公网可用的软件镜像源。Alpine、Ubuntu、Debian 均不支持 sw64 架构。实际项目中需要从统信 UOS 或麒麟 V10 厂商处获取申威平台的安装介质(ISO),然后基于此自建内部 yum/apt 源。JDK 等关键组件也需要从申威生态合作伙伴获取预编译版本。

# 申威 SW64 镜像源(指向自建内部 yum 源)
# 基于统信 UOS / 麒麟 V10 的 ISO 提取 RPM 包后,用 createrepo 创建本地 yum 源
RUN echo "[internal-sw64]" > /etc/yum.repos.d/internal.repo && \
    echo "name=Internal SW64 Mirror" >> /etc/yum.repos.d/internal.repo && \
    echo "baseurl=http://nexus.example.com/repos/sw64/" >> /etc/yum.repos.d/internal.repo && \
    echo "gpgcheck=0" >> /etc/yum.repos.d/internal.repo && \
    echo "enabled=1" >> /etc/yum.repos.d/internal.repo

5.2 自建内部镜像源(信创必备)

信创项目中,自建内部镜像源并非可选项,重点是必选项。原因如下:

  • 架构支持不足:Alpine/Ubuntu/Debian 官方源均不支持申威 sw64 和龙芯 loongarch64,必须使用国产 OS 并自建源
  • 公网源稀缺:龙芯公网源内容有限且不稳定,申威完全没有公网源
  • 安全合规:信创项目通常要求所有软件包经过内部安全审计,不能直接从公网拉取
  • 离线部署:很多信创环境物理隔离,无法访问互联网

Nexus 3 搭建 Docker Registry

# 使用 Nexus 3 搭建私有 Docker Registry
# 1. 部署 Nexus 3(可容器化或直接安装)
docker run -d --name nexus \
    -p 8081:8081 -p 5000:5000 \
    -v /opt/nexus-data:/nexus-data \
    sonatype/nexus3:latest

# 2. 在 Nexus Web UI 中创建 Docker (hosted) 仓库,端口 5000
# 3. 推送镜像
# docker tag xinchuang/corretto8-jdk:latest nexus.example.com:5000/base/corretto8-jdk:latest
# docker push nexus.example.com:5000/base/corretto8-jdk:latest

apt 本地源搭建(Debian/Ubuntu/Loongnix)

# 使用 aptly 管理 apt 本地源
aptly repo create -distribution=fusco loongnix-main
aptly repo add loongnix-main /path/to/loongnix-packages/
aptly publish repo -architectures="loongarch64" loongnix-main filesystem:loongnix:

yum 本地源搭建(统信 UOS / 麒麟 V10 / 申威)

# 使用 createrepo 管理 yum 本地源
# 1. 将 ISO 挂载并拷贝 RPM 包到本地目录
mkdir -p /opt/repos/sw64/Packages
cp /mnt/iso/Packages/*.rpm /opt/repos/sw64/Packages/

# 2. 创建 yum 仓库元数据
createrepo /opt/repos/sw64/

# 3. 通过 Nginx 或 Nexus 提供 HTTP 访问

从有网环境同步依赖到离线环境

# 方式一:rsync 同步(适用于同网络段)
rsync -avz --progress /opt/repos/ user@offline-server:/opt/repos/

# 方式二:容器镜像导出/导入(推荐用于 Docker 镜像离线传输)
# 有网环境导出
docker save -o corretto8-jdk.tar xinchuang/corretto8-jdk:8u422-alpine3.20
# 通过介质传输后导入
docker load -i corretto8-jdk.tar

# 方式三:多架构镜像先推送到内部 Registry,再在离线环境按目标架构拉取
# docker buildx imagetools inspect xinchuang.nexus.com/base/corretto8-jdk:8u422
# docker pull --platform linux/arm64 xinchuang.nexus.com/base/corretto8-jdk:8u422

5.3 JDK 安装的架构适配

# ============================================================
# 通用 JDK 安装逻辑(支持多架构自动适配)
# ============================================================
RUN ARCH=$(uname -m) && \
    echo "Detected architecture: ${ARCH}" && \
    case "${ARCH}" in \
        # Intel/AMD x86_64
        x86_64) \
            wget -q -O /tmp/jdk.tar.gz \
                "https://corretto.aws/downloads/latest/amazon-corretto-8.422.05.1-linux-x64-jdk.tar.gz" \
            ;; \
        # 鲲鹏/飞腾 ARM64
        aarch64) \
            wget -q -O /tmp/jdk.tar.gz \
                "https://corretto.aws/downloads/latest/amazon-corretto-8.422.05.1-linux-aarch64-jdk.tar.gz" \
            ;; \
        # 申威 SW64(需要本地预编译的 JDK)
        sw_64|sw64) \
            if [ -f /opt/swjdk/swjdk-8.tar.gz ]; then \
                cp /opt/swjdk/swjdk-8.tar.gz /tmp/jdk.tar.gz; \
            else \
                echo "ERROR: SW64 JDK not found at /opt/swjdk/" && exit 1; \
            fi \
            ;; \
        # 龙芯 LoongArch
        loongarch64) \
            if [ -f /opt/loongjdk/loongjdk-8.tar.gz ]; then \
                cp /opt/loongjdk/loongjdk-8.tar.gz /tmp/jdk.tar.gz; \
            else \
                echo "ERROR: LoongArch JDK not found at /opt/loongjdk/" && exit 1; \
            fi \
            ;; \
        *) \
            echo "ERROR: Unsupported architecture: ${ARCH}" && exit 1 \
            ;; \
    esac && \
    mkdir -p /usr/lib/jvm && \
    tar -xzf /tmp/jdk.tar.gz -C /usr/lib/jvm && \
    rm -f /tmp/jdk.tar.gz

六、成熟实践

6.1 多阶段构建

多阶段构建是镜像瘦身的核心手段。Docker 镜像层大小优化遵循以下原则:

末尾镜像大小 = 所有运行时必要文件的 Layer 之和

即末尾镜像只保留运行阶段的层,编译阶段的中间产物(Maven 缓存、编译器、源码等)全部丢弃。

# ============================================================
# 多阶段构建示例:编译 + 运行分离
# ============================================================

# 阶段 1:编译(使用完整 JDK)
FROM xinchuang/corretto8-jdk:8u422-alpine3.20 AS builder

WORKDIR /build
COPY pom.xml .
# 先下载依赖(利用 Docker 缓存层)
RUN mvn dependency:go-offline -B

COPY src ./src
RUN mvn package -DskipTests -B && \
    cp target/*.jar app.jar

# 阶段 2:运行(使用精简 JRE)
FROM xinchuang/corretto8-jre:8u422-alpine3.20

WORKDIR /app
COPY --from=builder /build/app.jar ./app.jar

EXPOSE 8080
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar app.jar ${0} ${@}"]
Docker 层缓存策略
将不常变动的指令放在 Dockerfile 前面(如 COPY pom.xml),常变动的放在后面(如 COPY src)。这样 Maven 依赖下载层可以被缓存命中,只在源码变更时重新编译。

6.2 镜像瘦身策略

# 在同一个 RUN 指令中完成安装 + 清理(减少层数)
RUN apk add --no-cache package1 package2 && \
    rm -rf /var/cache/apk/* /tmp/* /root/.cache

常用瘦身手段:

手段效果适用场景
多阶段构建减少 50%+编译型应用
JRE 替代 JDK减少 ~43%生产运行时
Alpine 基础镜像减少 ~80% vs Ubuntu通用
.dockerignore减少构建上下文所有项目
删除文档/源码减少 10-30MB所有 Java 镜像

6.3 安全扫描

# 使用 Trivy 扫描镜像漏洞
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
    aquasec/trivy image xinchuang/corretto8-jdk:8u422-alpine3.20

# 使用 Docker Scout(Docker Desktop 内置)
docker scout cves xinchuang/corretto8-jdk:8u422-alpine3.20

# 常见修复:
# 1. 定期更新基础镜像(Alpine 版本)
# 2. 升级 JDK 到最新安全补丁版本
# 3. 移除不必要的工具(curl、wget 在生产镜像中可以不装)
信创安全扫描要求
信创项目通常要求镜像无高危/严重漏洞。建议在 CI 流水线中集成 Trivy 扫描,设置 --severity HIGH,CRITICAL --exit-code 1 作为流水线卡点。

6.4 版本管理

# 镜像标签规范
# 格式:<registry>/<namespace>/<image>:<jdk-version>-<base-os><os-version>[-<arch>]

# 示例:
xinchuang.nexus.com/base/corretto8-jdk:8u422-alpine3.20
xinchuang.nexus.com/base/corretto8-jdk:8u422-alpine3.20-arm64
xinchuang.nexus.com/base/corretto8-jdk:8u422-kylin10

七、生产环境示例:Nacos 服务镜像

将前面构建的基础镜像应用到实际服务:

# ============================================================
# Nacos 信创生产镜像
# 基于自建 Corretto8 JDK 基础镜像
# ============================================================

FROM xinchuang.nexus.com/base/corretto8-jdk:8u422-alpine3.20

ARG NACOS_VERSION=2.3.2

ENV NACOS_HOME=/opt/nacos \
    MODE=standalone \
    SPRING_DATASOURCE_PLATFORM=""

# 安装 Nacos
RUN wget -q -O /tmp/nacos.tar.gz \
        "https://github.com/alibaba/nacos/releases/download/${NACOS_VERSION}/nacos-server-${NACOS_VERSION}.tar.gz" && \
    mkdir -p ${NACOS_HOME} && \
    tar -xzf /tmp/nacos.tar.gz -C /opt/ && \
    mv /opt/nacos-server-${NACOS_VERSION}/* ${NACOS_HOME}/ && \
    rm -rf /tmp/nacos.tar.gz /opt/nacos-server-${NACOS_VERSION}

# 注入国产 CPU 的 RocksDB JNI 库(如果有)
COPY librocksdbjni-*.so /tmp/rocksdbjni-patch/
RUN if ls /tmp/rocksdbjni-patch/librocksdbjni-*.so 1>/dev/null 2>&1; then \
        echo "Patching RocksDB JNI for native architecture..."; \
        /opt/scripts/patch-nacos-rocksdb.sh ${NACOS_HOME}/target/nacos-server.jar /tmp/rocksdbjni-patch/*.so; \
    fi && \
    rm -rf /tmp/rocksdbjni-patch

WORKDIR ${NACOS_HOME}

EXPOSE 8848 9848 9849

ENTRYPOINT ["sh", "-c", "${NACOS_HOME}/bin/startup.sh -m ${MODE} && tail -f ${NACOS_HOME}/logs/start.out"]

八、.dockerignore 成熟实践

创建 .dockerignore 文件,减少构建上下文大小:

# .dockerignore
.git
.gitignore
*.md
!README.md
target/
!target/*.jar
.idea/
*.iml
.DS_Store
node_modules/
logs/
*.log

构建上下文大小影响:

Build Context 传输时间 = Context Size / 网络带宽

排除不必要的文件可以将构建上下文从数百 MB 压缩到数十 MB,显著提升 docker build 启动速度。


九、总结

镜像构建 Checklist

□ 确认目标 CPU 架构(x86_64 / aarch64 / sw64 / loongarch64)
□ 选择基础镜像(Alpine / Ubuntu / 麒麟 / 统信)
□ 配置国内镜像源(阿里云 / 华为云 / 内部源)
□ 安装 JDK/JRE(Corretto / 申威定制 JDK / 龙芯定制 JDK)
□ 设置时区(Asia/Shanghai)和 Locale
□ 安装必要工具(curl、tzdata、ca-certificates)
□ 多阶段构建分离编译和运行环境
□ 镜像瘦身(清理缓存、删除不必要文件)
□ 安全扫描(Trivy / Docker Scout)
□ 规范化标签管理
□ 创建 .dockerignore
□ 推送到内部镜像仓库

架构速查

场景推荐方案
快速开发验证直接用 Corretto 官方镜像
鲲鹏 ARM64 生产Corretto + Alpine + buildx 多架构构建
申威/龙芯生产基于国产 OS + 定制 JDK 自行构建
信创安全审查基于麒麟/统信 + Trivy 安全扫描

参考资料