Docker多阶段构建与多架构构建指南

共计 2531 个字符,预计需要花费 7 分钟才能阅读完成。

简介

Docker的多阶段构建(Multi-stage builds)和多架构构建(Multi-platform builds)是两个强大的特性,可以帮助我们优化镜像大小并支持不同的硬件架构。本文将详细介绍这两个特性的实践应用。

1. Docker安装

首先需要在系统中安装Docker。以Ubuntu系统为例,执行以下步骤:

# step 1: 安装必要的系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

# Step 3: 添加软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# Step 4: 更新并安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

提示: 这里使用了阿里云的镜像源,可以提高国内下载速度。

2. 多阶段构建

多阶段构建可以显著减小最终镜像的大小。下面是一个Java应用的多阶段构建示例:

# 构建阶段
FROM eclipse-temurin:21.0.2_13-jdk-jammy AS builder
WORKDIR /opt/app
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:go-offline
COPY ./src ./src
RUN ./mvnw clean install

# 运行阶段
FROM eclipse-temurin:21.0.2_13-jre-jammy AS final
WORKDIR /opt/app
EXPOSE 8080
COPY --from=builder /opt/app/target/*.jar /opt/app/*.jar
ENTRYPOINT ["java", "-jar", "/opt/app/*.jar"]

这个多阶段构建的优点是:

  • 使用JDK镜像进行构建
  • 使用更小的JRE镜像运行
  • 最终镜像中不包含源码和构建工具

3. 多架构构建

3.1 初始化构建器

首先需要创建一个buildx构建器:

# 创建基本构建器
docker buildx create --use --name mybuild

# 如果需要代理,可以这样创建:
docker buildx create --name myproxybuilder \
  --driver-opt env.http_proxy=http://192.168.8.28:2080 \
  --driver-opt env.https_proxy=http://192.168.8.28:2080

3.2 基础镜像一致的情况

当不同架构使用相同的基础镜像时:

# syntax=docker/dockerfile:1
FROM --platform=$BUILDPLATFORM golang:alpine AS build
ARG TARGETPLATFORM
ARG BUILDPLATFORM
RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log

FROM alpine
COPY --from=build /log /log
ENTRYPOINT ["cat","/log"]

3.3 基础镜像不一致的情况

当需要为不同架构使用不同的基础镜像时:

# syntax=docker/dockerfile:1
FROM openjdk:8-jdk AS base-amd64
FROM arm64v8/openjdk:8-jdk AS base-arm64

FROM maven:3.8.6-openjdk-8 AS build
WORKDIR /app
COPY ./pom.xml pom.xml
RUN mvn install
COPY ./src src/
RUN mvn package -DskipTests

FROM base-${TARGETARCH}
WORKDIR /app
COPY --from=build /app/target/my-java-app-1.0.jar app.jar
CMD ["java", "-jar", "app.jar"]

4. GitHub Actions自动构建

可以使用GitHub Actions来自动化多架构镜像的构建和推送:

name: Build and push image
on:
  push:
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.REGISTRY_USERNAME }}
          password: ${{ secrets.REGISTRY_PASSWORD }}

      - name: Build and push by action
        uses: docker/build-push-action@v6
        with:
          push: true
          tags: deeplythink/java-hello-world:latest-action
          platforms: linux/amd64,linux/arm64

      - name: Build and push by script
        run: |
          make image

5. 参考资源

正文完
 0
评论(没有评论)