如何在 Raspberry Pi 4 上创建容器化 Spring 引导应用程序?
How to create containerized Spring Boot App on Raspberry Pi 4?
我想做什么?
我想将 运行 我的 容器化的 Spring-Boot 应用程序 转换为 =123=] 在 amd64 系统上,在 Raspberry Pi 4 的 Docker 上。我该如何解决我的问题?
Raspberry Pi 上的 运行ning OS 是什么?
我已经安装了 Ubuntu Server 20.04.2 LTS for arm64 architectures using via Raspberry Pi Imager v1.6.1 在 Raspberry Pi 4 .
我采取了哪些步骤来解决问题?(问题仍在继续)
默认版本不适用于我的 Raspberry Pi. 因此,我在下面。
我在 中将 openjdk:15-jdk-slim to arm64v8/openjdk:17 中的“FROM”行更改为dockerfile 如你所见:
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 和 [ 构建并推送了我的应用程序=114=]:
$ ./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,所以我将 image 从 mongo to arm64v8/mongo 在 docker-compose.yml 如下所示:
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-启动应用程序 不工作。在 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
让我知道哪些事情我没听清。感谢阅读。
我已经解决了我的问题,并尝试为遇到此问题的人创建简单的指南。
BUILD FOR OTHER OS(多架构/buildx 命令)
- 在 Docker 设置中打开“实验性”功能。
- 对于LinuxOS:
sudo nano /etc/docker/daemon.json
- 添加以下内容:
{
"experimental": true
}
- 对于 Win10 OS / MAC OS:
- 打开Docker桌面应用程序。
- 转到“设置”。
- Select Docker 左侧的引擎 选项卡。
- 找到
"experimental": false
.
- 改为
"experimental": true
。
- 重启Docker.
- 创建多架构os。 (重要:您使用的图片应该包含OS 你想创建它)
创建一个 SINGLE OS :
- 您可以使用加载或推送命令。
--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
不能设置在一起
创建 MANY OS :
你可以只使用 push 命令与许多 OS。
--push
表示docker不保存到本地磁盘而是保存到云端(docker hub):
docker buildx build --push --platform linux/amd64,linux/arm64,linux/ppc64le -t <dockerhub_username>/<repository_name>:<tag_name> .
我想做什么?
我想将 运行 我的 容器化的 Spring-Boot 应用程序 转换为 =123=] 在 amd64 系统上,在 Raspberry Pi 4 的 Docker 上。我该如何解决我的问题?
Raspberry Pi 上的 运行ning OS 是什么?
我已经安装了 Ubuntu Server 20.04.2 LTS for arm64 architectures using via Raspberry Pi Imager v1.6.1 在 Raspberry Pi 4 .
我采取了哪些步骤来解决问题?(问题仍在继续)
默认版本不适用于我的 Raspberry Pi. 因此,我在下面。
我在 中将 openjdk:15-jdk-slim to arm64v8/openjdk:17 中的“FROM”行更改为dockerfile 如你所见:
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 和 [ 构建并推送了我的应用程序=114=]:
$ ./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,所以我将 image 从 mongo to arm64v8/mongo 在 docker-compose.yml 如下所示:
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-启动应用程序 不工作。在 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
让我知道哪些事情我没听清。感谢阅读。
我已经解决了我的问题,并尝试为遇到此问题的人创建简单的指南。
BUILD FOR OTHER OS(多架构/buildx 命令)
- 在 Docker 设置中打开“实验性”功能。
- 对于LinuxOS:
sudo nano /etc/docker/daemon.json
- 添加以下内容:
{ "experimental": true }
- 对于 Win10 OS / MAC OS:
- 打开Docker桌面应用程序。
- 转到“设置”。
- Select Docker 左侧的引擎 选项卡。
- 找到
"experimental": false
. - 改为
"experimental": true
。
- 对于LinuxOS:
- 重启Docker.
- 创建多架构os。 (重要:您使用的图片应该包含OS 你想创建它)
创建一个 SINGLE OS :
- 您可以使用加载或推送命令。
--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
不能设置在一起
- 您可以使用加载或推送命令。
创建 MANY OS :
你可以只使用 push 命令与许多 OS。
--push
表示docker不保存到本地磁盘而是保存到云端(docker hub):docker buildx build --push --platform linux/amd64,linux/arm64,linux/ppc64le -t <dockerhub_username>/<repository_name>:<tag_name> .