在 Gitlab Runners 上构建 Docker Image OpenJDK16+ for ARM

Build Docker Image OpenJDK16+ for ARM on Gitlab Runners

我目前正在开发一个 Java 应用程序,我 运行 在我的 Raspberry 3B+ (arm32v7) 上。我正在 Java 14 上构建我的 JAR,并使用此 Docker 文件构建一个 Docker 图像。

FROM arm32v7/adoptopenjdk:14.0.2_8-jdk-hotspot-bionic
COPY /build/libs/project-1.0-SNAPSHOT.jar my-jar.jar
CMD java -jar my-jar.jar

这工作得很好。我正在使用 Gitlab CI 构建我的 jar 和我的 Docker 图像,使用以下内容:

image: openjdk:14-jdk-slim
    
before_script:
  - export GRADLE_USER_HOME=`pwd`/.gradle

stages:
  - build
  - package

gradle-build:
  stage: build
  script: "./gradlew build"
  artifacts:
    paths:
      - build/libs/*.jar

docker-build:
  image: docker:stable
  services:
    - docker:dind
  stage: package
  before_script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
  script:
    - export DOCKER_HOST=tcp://docker:2375/
    - docker build -t registry.gitlab.com/mygitlab/project .
    - docker push registry.gitlab.com/mygitlab/project
  tags:
    - docker

问题是每次我尝试升级 Docker 映像中的 Java 版本时,我都会收到以下错误:

Step 1/4 : FROM arm32v7/adoptopenjdk:16-jre 16-jre: Pulling from arm32v7/adoptopenjdk no manifest for linux/amd64 in the manifest list entries

我遇到了很多 arm32v7 兼容图像的问题。事实上,我现在使用的那个似乎是唯一有效的。

我还是 Docker 的初学者,我不确定是否清楚地了解我的问题。据我了解,我正在使用的 Gitlab Runner 无法识别我正在尝试使用的图像,但我该如何更改它?

感谢您的帮助。

no manifest for linux/amd64 in the manifest list entries

当您提取 docker 图像时,docker 检查 dockerhub 中的清单以查看是否有与您的系统架构相匹配的图像。

GitLab CI 运行ners 运行 linux/amd64 架构,而不是 ARM。您不能 pull/run 图像用于其他平台。存储库 arm32v7/adoptopenjdk 仅适用于 ARM CPU 架构。因此,您无法在 gitlab 运行ners.

上提取该图像

您可以做的一些事情:

  1. 在 docker 文件的 FROM 行中使用多架构存储库,例如 adoptopenjdk(或其替代 eclipse-temurin),而不是单一架构 arm32v7/adoptopenjdk 资料库。
    这是通常的做事方式。 Docker 会自动拉取正确的架构镜像
  2. 在基于 ARM 的系统上自行托管您自己的 gitlab-运行ner
  3. multi platform builds (requires qemu virtual machines supporting your desired architectures) guide for gitlab runners here
  4. 使用docker buildx

但是,您需要确保在选择标签时,它存在于您所需的体系结构中。例如,您可以看到此图片适用于 linux/arm/v7linux/amd64。所以拉 eclipse-temurin:11-jdk-focal 将在你的 ARM 系统和 GitLab CI 运行ners.

上工作

但是,如果您正在制作衍生图像并且您打算将它们推送到您的注册表并将它们拉到您的 raspberry pi,您仍然需要构建两个架构并将它们推送到您的注册表(例如使用docker buildx 用于多架构构建)如上文 (3) 所述。