当前位置: 首页 > 知识库问答 >
问题:

如何将Spring应用程序正确部署到docker(应用程序有映像,但未检测到容器)

幸经艺
2023-03-14

说明:

让我提一下,这是我第一次接触docker,我可能犯了一些我不知道的重大错误。我想将一个用Spring boot编写的应用程序放入docker。我正在使用本教程,但尽管遵循分步执行说明,我还是无法正确完成它。

链接到教程:[1]:https://tutorial https://blog.devgenius.io/dockerizing-spring-app-with-gradle-3b6fbd650bf7

项目建设:

我用一个简单的控制器创建了一个简单的Spring Boot应用程序,它显示消息“hello world”没有什么困难,我更关心的是将应用程序放在docker中。

我使用gradle作为一个自动化工具(我更喜欢gradle而不是maven,这是我将要使用的工具)。我在构建中只放了一个依赖项。gradle文件:Spring WEB。我在项目的主目录中创建了一个Dockerfile文件和配置。

HelloController.java

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Optional;

@RestController
public class HelloController {

    @RequestMapping(method = RequestMethod.GET)
    public String hello(@RequestParam Optional<String> name) {
        return name.map(n -> "Hello " + n + "!").orElse("Hello, World!");
    }

}
 

build.gradle

plugins {
    id 'org.springframework.boot' version '2.7.2'
    id 'io.spring.dependency-management' version '1.0.12.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

Dockerfile文件

FROM openjdk:12-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} springreadyapp.jar
ENTRYPOINT ["java","-jar","/springreadyapp.jar"]

我如何尝试将应用程序放入Docker:

我使用IntelliJ环境中的终端处理命令。我按以下顺序输入命令。

构建项目

./gradlew clean build -x test

构建docker图像

docker image build -t springreadyapp .

查看图像[返回springreadyapp最新8b83d5b46efe 50秒前356MB]

docker images

Docker容器从图像运行[返回日志41a6de399568eb41d65b13473739c52e43b947ff89a05c0c18120f7f361881b9]

docker run -d -p 8081:8081 8b83d5b46efe 

容器列表[无返回]

docker container ps

观察:

问题是,即使图像已经创建,图像已经启动(我认为是的,它返回了一个日志),容器也不会显示。

我又看了一眼Docker桌面,看看那里发生了什么,并观察到了一些有趣的事实。在“图像”选项卡中,可以看到先前创建的图像。另一方面,在容器盖中,我看到已经创建了容器(名称为romantic_benz),并为其分配了一个springreadyapp图像。它返回Exited(1)作为状态。当我尝试运行容器时,状态为Running,但仅持续1s,并返回到Exited(1),当我单击容器时,会出现异常:

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/example/springreadyapp/SpringReadyAppApplication has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 56.0

有趣的是,在终端中它没有向我显示创建的容器,但在桌面应用程序中它已经向我显示了它,诚然抛出了一个异常。

所以,我真的不知道我哪里出错了,或者我是否在某个地方错误配置了文件,或者我是否试图以错误的方式对应用程序进行Dockerize。

提前感谢您的帮助。

共有1个答案

皇甫俊雅
2023-03-14

gradle文件显示sourceCompatibility=17,但dockerfile使用openjdk:12 jdk alpine的版本12。

Docker的OpenJDK镜像已经被弃用,您需要使用不同的镜像来运行17个代码。

例如termurin,以前采用的OpenJDK,来自eclipse temurin:17 jdk alpine

 类似资料:
  • 我想第一次使用docker发布我在spring boot中制作的应用程序。然而,在发布时出现了一个问题。 因此,我上传到conter的图像不显示。 以下是我采取的步骤,我将立即添加我使用gradle的步骤。 > 我将Docker插件下载到IntelliJ 我创建了一个Dockerfile,其中我放了: 音量 /tmp ARG JAR_文件 在终端中,我键入以下命令来构建项目: chmod 777

  • [错误]无法执行目标组织。阿帕奇。专家插件:maven编译器插件:3.8。1:在project Divi up后端上编译(默认编译):编译时出现致命错误:目标版本无效:15- 我得到了上面的错误,有人知道为什么会这样吗?

  • 我试图将Spring Boot应用程序部署到Heroku,但我无法做到这一点。我的应用程序会自动检测为"heroku-maven-plugin",但我想将其部署为Java应用程序。 我怎样才能做到这一点?

  • Intellij未检测到在其他IDE中创建的spring boot应用程序。讨论中的应用程序是以字母“e”开头的应用程序 我该如何解决这个问题?我正在使用intellij社区版。

  • 我有带pom的spring boot应用程序。xml 所以,我需要构建war并将其部署到websphere上。但部署后,会出现错误消息: 脚本计数=1048576 ************* 结束显示当前环境 ************* [9/20/18 18:35:17:893 MSK] 00000089 ecs Wcom.ibm.ws.ecs.internal.scan.context.imp

  • 我从昨天开始尝试在AWS Beanstalk上的Tomcat中部署Spring启动,但我总是出现此异常: 在我的本地开发环境中,我没有这个错误。在我的本地开发环境中,我在Tomcat 7上开发了“1.0.2.RELEASE”版本。 我创建了一场战争,我在AWS Beanstalk中的Tomcat 7实例上部署了它,但下面的错误总是出现。如何修复此错误?