问题背景
在原始的Dockerfile中,安装 fontconfig
工具时需要从网络下载文件,导致构建速度较慢。为了提升构建速度,我决定通过预下载文件与分阶段构建的方式来优化。
预下载文件
为了避免在构建过程中从网络下载文件,提前将 SimSun.ttf
字体文件和 sifan-erp-h3yun-api.jar
下载到本地。
- 将
SimSun.ttf
放在./fonts/
目录下。 - 将
sifan-erp-h3yun-api.jar
放在./target/
目录下。
分阶段构建
为了进一步提升构建速度,将Dockerfile分为两个部分:Dockerfile.base
和 Dockerfile
。
Dockerfile.base
Dockerfile.base
用于构建基础镜像,包含字体安装和 fontconfig
工具的安装。
bash
复制
# Dockerfile.base
# 基础镜像 Dockerfile镜像构建时,需要先构建此镜像
FROM openjdk:8-jdk-alpine
# 安装中文字体(宋体)
# 创建自定义字体目录
RUN mkdir -p /usr/share/fonts/truetype
COPY ./fonts/SimSun.ttf /usr/share/fonts/truetype/
# 安装 fontconfig 工具
RUN apk add --no-cache fontconfig
RUN fc-cache -f -v
Dockerfile
Dockerfile
基于 Dockerfile.base
构建的镜像,用于部署应用程序。
bash
复制
# Dockerfile
# 基于本地基础镜像 Dockerfile.base
FROM jdk-font-h3yun:1.0
# 设置工作目录
WORKDIR /opt/apps/h3yun/logs/
# 拷贝应用程序 JAR 文件
ADD ./target/sifan-erp-h3yun-api.jar /App/
# 暴露端口(仅声明,无实际作用)
EXPOSE 9091
# 指定 JVM 参数并运行 JAR 文件
ENTRYPOINT ["java", "-Xmx512m", "-jar"]
CMD ["/App/sifan-erp-h3yun-api.jar"]
构建指令
-
构建基础镜像:
bash
复制
docker build -t jdk-font-h3yun:1.0 -f Dockerfile.base .
-
构建应用程序镜像:
bash
复制
docker build -t sifan-erp-h3yun-api:1.0 -f Dockerfile .
优势
- 基础镜像只需构建一次:基础镜像中包含耗时的操作(如字体安装和
fontconfig
工具的安装),只需构建一次,后续构建应用程序镜像时可以直接使用。 - 提升构建速度:由于基础镜像已经构建完成,后续构建应用程序镜像时只需进行简单的文件拷贝和配置,大大缩短了构建时间。
- 减少网络依赖:通过预下载文件,避免了在构建过程中从网络下载文件,减少了网络依赖和潜在的构建失败风险。
通过这种分阶段构建的方式,不仅提升了构建速度,还使得Dockerfile更加模块化和易于维护。