首页 > 解决方案 > 如何在 Raspberry Pi 4 上创建容器化 Spring Boot 应用程序?

问题描述

我想做什么?

我想转换为运行容器化的 Spring-Boot 应用程序,该应用程序可以在 amd64 系统上运行,在 Raspberry Pi 4 的 Docker 上。我该如何解决我的问题?


Raspberry Pi 上运行的操作系统是什么?

我已经通过Raspberry Pi Imager v1.6.1 on Raspberry Pi 4为 arm64 架构安装了 Ubuntu Server 20.04.2 LTS



我为解决问题采取了哪些步骤?(问题仍在继续)

默认版本不适用于我的Raspberry Pi。因此,我在下面尝试了一些事情。

如您所见,我在dockerfile中将“FROM”行从openjdk:15-jdk-slim更改为arm64v8/openjdk:17 :

FROM arm64v8/openjdk:17
COPY . /projects/red-dir
WORKDIR /projects/red-dir
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} /projects/red-dir/my_red_app.jar
ENTRYPOINT ["java","-jar","/projects/red-dir/my_red_app.jar"]

之后,我使用MavenDocker构建并推送了我的应用程序:

$ ./mvnw clean package -Dmaven.test.skip=true && java -jar target/my_red_app.jar
$ docker build -t user/my_red_app:v1.0.0 .

然后,我的应用程序依赖于 MongoDB,所以我在 docker -compose.yml上将此图像mongo更改为arm64v8/mongo,如下所示:

version: "3"
services:
    mongodb:
        container_name: mongodb
        image: arm64v8/mongo
        restart: always
        ports:
            - 27017:27017
        environment:
            MONGO_INITDB_ROOT_USERNAME: admin
            MONGO_INITDB_ROOT_PASSWORD: 12345
        networks:
            - shared-net
    colour_app:
        container_name: my_red_app
        image: user/my_red_app
        restart: always
        ports:
            - 7070:7070
        depends_on:
            - mongodb
        networks:
            - shared-net
networks:
    shared-net:
        driver: bridge


有用的东西和没用的东西

MongoDB正在运行。我可以通过MongoDBCompass使用,但我的Spring-Boot 应用程序不起作用。在docker-compose up命令中,我遇到了这样的输出:

...
...
colour_app    | standard_init_linux.go:219: exec user process caused: exec format error
colour_app    | standard_init_linux.go:219: exec user process caused: exec format error
colour_app    | standard_init_linux.go:219: exec user process caused: exec format error
colour_app    | standard_init_linux.go:219: exec user process caused: exec format error

让我知道我没有抓到的东西。感谢您的阅读。

标签: spring-bootdockermavendocker-composeraspberry-pi4

解决方案


我已经解决了我的问题,并尝试为遇到此问题的人创建简单的指南。

为其他操作系统构建(多架构/buildx 命令)

  1. 打开 Docker 设置上的“实验性”功能。
    • 对于 Linux 操作系统
      1. sudo nano /etc/docker/daemon.json
      2. 向其中添加以下内容:
        {
          "experimental": true
        }
        
    • 对于 Win10 操作系统/MAC 操作系统
      1. 打开Docker 桌面应用程序。
      2. 前往设置。
      3. 选择左侧的Docker Engine选项卡。
      4. 找到"experimental": false
      5. 将其更改为"experimental": true.
  2. 重启 Docker。
  3. 创建多架构操作系统。(重要提示:您使用的映像应包含您要创建的操作系统
    • 创建一个单一的操作系统

      1. 您可以使用加载或推送命令。
        • --load表示docker将其保存到本地磁盘:
          docker buildx build --load --platform linux/arm64 -t <dockerhub_username>/<repository_name>:<tag_name> .
          
        • --push表示docker不会将其保存到本地磁盘而是将其保存到云端(docker hub):
          docker buildx build --push --platform linux/arm64 -t <dockerhub_username>/<repository_name>:<tag_name> .
          
        • --load并且--push不能一起设置。
    • 创建许多操作系统

      1. 您可以在许多操作系统上使用 push 命令。

        • --push表示docker不会将其保存到本地磁盘而是将其保存到云端(docker hub):

          docker buildx build --push --platform linux/amd64,linux/arm64,linux/ppc64le -t <dockerhub_username>/<repository_name>:<tag_name> .
          

推荐阅读