写在最前

1. Buildx

1.1 部署安装

# 创建 CLI 插件目录(如果不存在)
mkdir -p ~/.docker/cli-plugins
# 下载 buildx v0.26.1 for linux-amd64
curl -L https://github.com/docker/buildx/releases/download/v0.26.1/buildx-v0.26.1.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx
# 添加执行权限
chmod +x ~/.docker/cli-plugins/docker-buildx
# 查看版本确认成功
docker buildx version


[root@localhost ~]# # 下载 buildx v0.26.1 for linux-amd64
[root@localhost ~]# curl -L https://github.com/docker/buildx/releases/download/v0.26.1/buildx-v0.26.1.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 64.5M  100 64.5M    0     0  11.2M      0  0:00:05  0:00:05 --:--:-- 14.4M
[root@localhost ~]# # 添加执行权限
[root@localhost ~]# chmod +x ~/.docker/cli-plugins/docker-buildx
[root@localhost ~]# # 查看版本确认成功
[root@localhost ~]# docker buildx version
github.com/docker/buildx v0.26.1 1a8287f22cf5a38339a4c1bf432b803c5f8b2aae
[root@localhost ~]# 

1.2 代理配置

172.31.0.1:7890 是我在 Windows 上通过 Clash for Windows 配置的代理端口,用来让容器或其他服务访问外网资源(如 docker.io)。

#创建buildx环境,并使用本机代理
docker buildx create --use --name mybuilder --driver-opt env.http_proxy=172.31.0.1:7890 --driver-opt env.https_proxy=172.31.0.1:7890
 
#修改所使用的buildx环境
docker buildx use mybuilder
 


#使用完毕后如果你不想要这个代理网络了,可以删除环境
docker buildx rm mybuilder

1.3 使用方式

# 默认构建出来使用docker images是看不到的,你要么使用--push直接推送上去仓库,要么使用--load才能使用docker images看到
# --progress=plain 输出详细格式化后的内容
docker buildx build --platform linux/amd64,linux/arm64 --push -t tanqidi/builder-base:v3.1.0-podman .

2. 试验流程

为了支持在 ARM 架构上部署 Kubesphere 3.4.1 的 DevOps 流水线,官方没有提供相应的 ARM 架构镜像。因此,我们将自己动手构建这些镜像,以确保能够在 ARM 环境中顺利运行。

2.1 分析镜像层级

在 v3.2.0 的 maven/podman/Dockerfile 中,我们注意到其基础镜像使用的是 kubespheredev/builder-base:v3.1.0-podman。经过确认,这个镜像目前仅支持 amd64 架构,并不包含 arm64。因此问题的根源就在这里。要在 ARM 架构上构建 builder-maven:v3.2.0-podman,我们必须先将 builder-base:v3.1.0-podman 适配为 arm64 架构,这样才能顺利完成后续镜像的构建。

image-TUXm.png

https://github.com/kubesphere/devops-agent/tree/v3.2.0

2.2 构建 builder-base:v3.1.0-podman

devops-agent-3.1.0.zip

FROM almalinux:9.4

# utils
RUN yum update -y && yum install -y epel-release && \
  yum install -y unzip \
  glibc-locale-source glibc-langpack-zh glibc-langpack-en \
  which \
  make \
  wget \
  zip \
  bzip2 \
  gcc \
  gcc-c++ \
  curl-devel \
  autoconf \
  expat-devel \
  gettext-devel \
  openssl-devel \
  perl-devel \
  zlib-devel \
  python-pip \
  git \
  java-1.8.0-openjdk && \
  yum -y clean all --enablerepo='*'


# Set the locale(en_US.UTF-8)
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

# USER jenkins
WORKDIR /home/jenkins

ENV SONAR_SCANNER_VERSION 3.3.0.1492

RUN curl -o sonar_scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux.zip && \
    unzip sonar_scanner.zip && rm sonar_scanner.zip \
    && rm -rf sonar-scanner-$SONAR_SCANNER_VERSION-linux/jre && \
    sed -i 's/use_embedded_jre=true/use_embedded_jre=false/g' /home/jenkins/sonar-scanner-$SONAR_SCANNER_VERSION-linux/bin/sonar-scanner && \
    mv /home/jenkins/sonar-scanner-$SONAR_SCANNER_VERSION-linux /usr/bin

ENV PATH $PATH:/usr/bin/sonar-scanner-$SONAR_SCANNER_VERSION-linux/bin

COPY ./ ./
RUN ./hack/install_utils.sh && rm -rf ./*

CMD ["docker","version"]
docker buildx build --platform linux/arm64 --push -t tanqidi/builder-base:v3.1.0-podman .

2.3 构建 builder-maven:v3.2.0-podman

devops-agent-3.2.0.tar.gz

FROM tanqidi/builder-base:v3.1.0-podman

# ----------- Java (固定版本,ARM64) ------------
RUN curl -fsSL https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u392-b08/OpenJDK8U-jdk_aarch64_linux_hotspot_8u392b08.tar.gz \
    | tar -xz -C /opt && \
    mv /opt/jdk8u392-b08 /opt/java

ENV JAVA_HOME=/opt/java
ENV PATH="${JAVA_HOME}/bin:${PATH}"

# ----------- Maven(固定版本) ------------
RUN curl -fsSL https://archive.apache.org/dist/maven/maven-3/3.5.3/binaries/apache-maven-3.5.3-bin.tar.gz \
    | tar -xz -C /opt && \
    mv /opt/apache-maven-3.5.3 /opt/maven

ENV M2_HOME=/opt/maven
ENV PATH="${M2_HOME}/bin:${PATH}"

# ----------- Ant(固定版本,可选) ------------
RUN curl -fsSL https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.7-bin.tar.gz \
    | tar -xz -C /opt && \
    mv /opt/apache-ant-1.10.7 /opt/ant

ENV ANT_HOME=/opt/ant
ENV PATH="${ANT_HOME}/bin:${PATH}"

# 默认运行 Maven 版本查看
CMD ["mvn", "-version"]
# --progress=plain 输出详细格式化后的内容
docker buildx build --platform linux/arm64 --progress=plain --push -t tanqidi/builder-maven:v3.2.0-podman .

3. 镜像成品

  • tanqidi/builder-maven:v3.2.0-podman

写在最后