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

Posted

技术标签:

【中文标题】在 Gitlab Runners 上为 ARM 构建 Docker Image OpenJDK16+【英文标题】:Build Docker Image OpenJDK16+ for ARM on Gitlab Runners 【发布时间】:2021-12-23 21:56:46 【问题描述】:

我目前正在开发一个在我的 Raspberry 3B+ (arm32v7) 上运行的 Java 应用程序。我正在 Java 14 上构建我的 JAR 并使用这个 Dockerfile 构建一个 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 版本时,都会收到以下错误:

第 1/4 步:FROM arm32v7/adoptopenjdk:16-jre 16-jre:从 arm32v7/adoptopenjdk 中提取清单条目中没有 linux/amd64 的清单

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

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

感谢您的帮助。

【问题讨论】:

【参考方案1】:

清单列表条目中没有 linux/amd64 的清单

当你拉取 docker 镜像时,docker 会检查 dockerhub 中的清单,看看是否有与你的系统架构相匹配的镜像。

GitLab CI 运行器在 linux/amd64 架构上运行,而不是 ARM。您不能为其他平台拉取/运行图像。存储库 arm32v7/adoptopenjdk 仅适用于 ARM CPU 架构。因此,您无法在 gitlab 运行器上提取该图像。

你可以做的一些事情:

    在 dockerfile 的 FROM 行中使用多架构存储库,例如 adoptopenjdk(或其替代品 eclipse-temurin),而不是单一架构 arm32v7/adoptopenjdk 存储库。 这是通常的做事方式。 Docker 会自动拉取正确的架构镜像 在基于 ARM 的系统上自行托管您自己的 gitlab-runner 将docker buildx 用于multi platform builds(需要支持所需架构的qemu 虚拟机)guide for gitlab runners here

但是,您需要确保在选择标签时它存在于您所需的架构中。例如,您可以看到此图像可用于linux/arm/v7linux/amd64。因此,拉动eclipse-temurin:11-jdk-focal 将在您的 ARM 系统和 GitLab CI 运行器上工作。

但是,如果您正在制作衍生映像并且打算将它们推送到您的注册表并将它们拉到您的树莓派上,您仍然需要构建这两种架构并将它们推送到您的注册表(例如,使用 docker buildx 进行多-arch builds) 如上面 (3) 中所述。

【讨论】:

你好 sytech。谢谢你的回答,我现在明白了。我使用了 buildx 并指定了 arm 架构,它可以工作。再次感谢。

以上是关于在 Gitlab Runners 上为 ARM 构建 Docker Image OpenJDK16+的主要内容,如果未能解决你的问题,请参考以下文章

如果外部 url 没有改变,gitlab runners 是不是需要在迁移后重新注册?

2023年最新详细教程!手把手教你搭建Hexo + GitLab个人博客

如何使用 LLVM 在 Windows 上为 ARM 编译 C++ 程序?

在 Linux 上为 ARM 将 *.hex 转换为 *.bin

在 ARM 平台上为嵌入式 Linux 交叉编译 Clion

如何在 Azure DevOps 上为发布服务器项目而不是客户端的 Blazor WebAssembly 托管应用程序创建构建管道?