spring-boot - 如何在 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"]
之后,我使用Maven和Docker构建并推送了我的应用程序:
$ ./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
让我知道我没有抓到的东西。感谢您的阅读。
解决方案
我已经解决了我的问题,并尝试为遇到此问题的人创建简单的指南。
为其他操作系统构建(多架构/buildx 命令)
- 打开 Docker 设置上的“实验性”功能。
- 对于 Linux 操作系统:
sudo nano /etc/docker/daemon.json
- 向其中添加以下内容:
{ "experimental": true }
- 对于 Win10 操作系统/MAC 操作系统:
- 打开Docker 桌面应用程序。
- 前往设置。
- 选择左侧的Docker Engine选项卡。
- 找到
"experimental": false
。 - 将其更改为
"experimental": true
.
- 对于 Linux 操作系统:
- 重启 Docker。
- 创建多架构操作系统。(重要提示:您使用的映像应包含您要创建的操作系统)
创建一个单一的操作系统:
- 您可以使用加载或推送命令。
--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
不能一起设置。
- 您可以使用加载或推送命令。
创建许多操作系统:
您可以在许多操作系统上使用 push 命令。
--push
表示docker不会将其保存到本地磁盘而是将其保存到云端(docker hub):docker buildx build --push --platform linux/amd64,linux/arm64,linux/ppc64le -t <dockerhub_username>/<repository_name>:<tag_name> .
推荐阅读
- android - 如何将数据从 Android 应用程序发送到 Web 服务器
- javascript - 覆盖常春藤中的生命周期方法
- html - 无法让多个嵌套的 ngif 语句按预期工作
- php - Laravel Eloquent 方法对 mysql 表进行 AND 操作
- java - 应用程序在一台 PC 上启动后立即关闭,但在另一台 PC 上运行良好
- python - 结合动态标签/区域(Python,scikit-image)
- sql - Rails / SQL:计算具有特定状态的连续记录数
- asp.net - 如何在表格内多个渲染单选按钮
- java - 如何解析示例中给出的数组列表?
- python - 如何用户向 QDoubleSpinBox 输入无穷大值?