在 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.
上提取该图像
您可以做的一些事情:
- 在 docker 文件的
FROM
行中使用多架构存储库,例如 adoptopenjdk
(或其替代 eclipse-temurin
),而不是单一架构 arm32v7/adoptopenjdk
资料库。
这是通常的做事方式。 Docker 会自动拉取正确的架构镜像
- 在基于 ARM 的系统上自行托管您自己的 gitlab-运行ner
- 对multi platform builds (requires qemu virtual machines supporting your desired architectures) guide for gitlab runners here
使用docker buildx
但是,您需要确保在选择标签时,它存在于您所需的体系结构中。例如,您可以看到此图片适用于 linux/arm/v7
和 linux/amd64
。所以拉 eclipse-temurin:11-jdk-focal
将在你的 ARM 系统和 GitLab CI 运行ners.
上工作
但是,如果您正在制作衍生图像并且您打算将它们推送到您的注册表并将它们拉到您的 raspberry pi,您仍然需要构建两个架构并将它们推送到您的注册表(例如使用docker buildx
用于多架构构建)如上文 (3) 所述。
我目前正在开发一个 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.
您可以做的一些事情:
- 在 docker 文件的
FROM
行中使用多架构存储库,例如adoptopenjdk
(或其替代eclipse-temurin
),而不是单一架构arm32v7/adoptopenjdk
资料库。
这是通常的做事方式。 Docker 会自动拉取正确的架构镜像 - 在基于 ARM 的系统上自行托管您自己的 gitlab-运行ner
- 对multi platform builds (requires qemu virtual machines supporting your desired architectures) guide for gitlab runners here 使用
docker buildx
但是,您需要确保在选择标签时,它存在于您所需的体系结构中。例如,您可以看到此图片适用于 linux/arm/v7
和 linux/amd64
。所以拉 eclipse-temurin:11-jdk-focal
将在你的 ARM 系统和 GitLab CI 运行ners.
但是,如果您正在制作衍生图像并且您打算将它们推送到您的注册表并将它们拉到您的 raspberry pi,您仍然需要构建两个架构并将它们推送到您的注册表(例如使用docker buildx
用于多架构构建)如上文 (3) 所述。