[软开工程化实践] [JAVA] 怎么基于官方镜像编译一个支持多平台定制化docker基础镜像
需求说明
在项目开发过程中,经常会遇到需要依赖docker运行容器环境中的资源,但是没有官方镜像或者不符合自己需求时候,需要自己制作镜像。
自己制作镜像时候,会遇到跨平台、构建安装缓慢等问题。本文档将围绕着两个问题,以构建字体的镜像为例说明解决方法。
解决步骤
选取一个支持多平台的基础镜像openjdk:8u342-jre-slim-buster,此处可以根据自己需求跟换
选取一个支持多平台,且风险漏洞低的镜像

如果你无法访问https://hub.docker.com/,可以在镜像网站查找https://xuanyuan.cloud/(非广告)
编写基础镜像构建Dockerfile
# 使用官方多架构支持的 openjdk:8u342-jre-slim-buster
FROM openjdk:8u342-jre-slim-buster
# 设置时区和语言环境
ENV TZ=Asia/Shanghai
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 更换阿里云镜像源,加快字体安装包的下载
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \
sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list
# 安装字体和必要的依赖(此处应注意字体版权问题)
RUN apt-get update && apt-get install -y --no-install-recommends \
# 基础工具
locales \
# 字体配置工具
fontconfig \
# 英文字体
fonts-dejavu \
fonts-dejavu-core \
fonts-dejavu-extra \
# 中文字体
fonts-wqy-microhei \
fonts-wqy-zenhei \
# 备用字体
ttf-wqy-microhei \
xfonts-wqy \
&& rm -rf /var/lib/apt/lists/*
# 创建自定义字体目录
RUN mkdir -p /usr/share/fonts/custom
# 复制所有 Windows 字体文件
COPY fonts/ /usr/share/fonts/custom/
# 设置字体权限和缓存
RUN chmod 644 /usr/share/fonts/custom/* && \
fc-cache -fv
# 验证字体安装
RUN echo "=== 验证所有 Windows 字体 ===" && \
fc-list && \
echo "=== 字体文件检查 ===" && \
ls -la /usr/share/fonts/custom/ | head -10
执行如下构建命令(arm和amd64机器都可以)
#!/bin/bash
# 镜像名称和标签,此处使用了私有仓库,可切换成自己的仓库地址,
# 当前执行的命令行用户,需要有`artifacts.xxxx.com/zhbg-docker-private/seana`仓库的上传权限
IMAGE_NAME="artifacts.xxxx.com/zhbg-docker-private/seana/openjdk"
TAG="8u342-jre-slim-buster-fonts"
# 创建 buildx 构建器(如果不存在)
echo "Setting up buildx..."
docker buildx create --name multiarch-builder --use 2>/dev/null || true
docker buildx inspect --bootstrap
# 构建并推送多架构镜像
echo "Building multi-architecture image..."
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t $IMAGE_NAME:$TAG \
--push .
echo "Build completed!"
构建应用镜像,使用编译后的镜像地址
#带字体和jdk环境的镜像
FROM artifacts.xxxx.com/zhbg-docker-private/seana/openjdk:8u342-jre-slim-buster-fonts
#ARG version
ENV basepath=/xxx/server/zbg-llm-application/openapi/
COPY ./kop-openapi/target/*.tar.gz ${basepath}/openapi.tar.gz
RUN cd ${basepath} && tar -zxf openapi.tar.gz -C ${basepath} --strip-components 1 && mkdir logs && chmod 777 bin/dockerstart.sh && rm -rf openapi.tar.gz
#RUN cd ${basepath} rm -rf openapi.tar.gz
EXPOSE 8312
CMD /xxxx/server/zbg-llm-application/openapi/bin/dockerstart.sh
构建应用镜像,使用buildx构建跨平台镜像,此步骤是构建多平台镜像关键
# 1. 检查并初始化构建器
echo "[STEP 1] 初始化构建器!"
BUILDER_NAME="myMultiarch"
if ! docker buildx ls | grep -q "$BUILDER_NAME"; then
echo "[INFO] 创建构建器: $BUILDER_NAME"
docker buildx create --name "$BUILDER_NAME" --use --driver=docker-container
# 新构建器必须启动
docker buildx inspect --bootstrap
else
echo "[INFO] 使用现有构建器: $BUILDER_NAME"
docker buildx use "$BUILDER_NAME"
# 检查构建器是否已运行,未运行则启动
if ! docker buildx inspect "$BUILDER_NAME" | grep -q "Status: running"; then
echo "[INFO] 启动构建器..."
docker buildx inspect --bootstrap
fi
fi
# 2. 构建并推送镜像
echo "[STEP 2] 构建并推送镜像!"
IMAGE_TAG="V1.0"
docker buildx build \
--platform linux/amd64,linux/arm64/v8 \
-t "artifacts.xxx.com/zhbg-docker-private/seana/openapi:$IMAGE_TAG" \
-f ./openapi/Dockerfile \
--push .
镜像使用
在amd64服务器或者arm器上直接拉取artifacts.xxx.com/zhbg-docker-private/seana/openapi:V1.0镜像,即可获得对应平台上的镜像。

浙公网安备 33010602011771号