【问题标题】:Spring Boot static resources are in my built jar but not in jar deployed to DockerSpring Boot 静态资源在我构建的 jar 中,但不在部署到 Docker 的 jar 中
【发布时间】:2021-01-24 20:57:25
【问题描述】:

我想知道这篇文章的标题是否不应该是“我无知”。这显然是一个常见问题,我已经阅读了多个主题,但在某个地方我缺少知识或……某些东西。

  • /questions/24661289/spring-boot-not-serving-static-content
  • /questions/54735747/spring-boot-not-serving-static-files-from-inside-jar
  • /questions/63061943/how-to-load-static-files-with-spring-boot-inside-a-docker-container-hosted-on-aw

我已经确认我的问题是静态资源没有进入 Docker。使用 CLI,我可以在那里解压缩 jar,并看到那里没有 html、js 或 css 文件。

但是,我已经确认我正在使用的罐子(我想我正在使用它,无论如何。我不知道它怎么不可能。)确实有它们。就好像它们以某种方式被故意提取和排除。

这是我的 application.properties:

#FOR LOCAL
#spring.datasource.url=jdbc:postgresql://localhost:5432/library

#FOR DOCKER
spring.datasource.url=jdbc:postgresql://postgresqldb:5432/library

spring.datasource.username=postgres
spring.datasource.password=password
spring.datasource.driver-class-name=org.postgresql.Driver

#The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

#Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto=create
spring.datasource.initialization-mode=always

#This enables app to serve the static content. Not sure why I need it, but it makes it work locally.
server.contextPath=/

这是我的 Dockerfile

FROM openjdk:8-jdk-alpine

ARG JAR_FILE=build/libs/microservice1-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} bookws.jar

ENTRYPOINT ["java","-jar","/bookws.jar"]

这是我的 docker-compose.yaml

version: '3.1'
services:
  app:
    container_name: bookws
    image: bookws
    build: ./
    ports:
      - "8080:8080"
    depends_on:
      - postgresqldb
  postgresqldb:
    image: postgres
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=password
      - POSTGRES_USER=postgres
      - POSTGRES_DB=library

这是我的主要 java 文件:

//package and imports excluded for brevity

@SpringBootApplication
public class Microservice1Application {

    public static void main(String[] args) {
        SpringApplication.run(Microservice1Application.class, args);
    }

}

我的静态资源存放在 src/main/resources/static

static/index.html
static/js/book-crud.js
static/js/jquery-3.5.0.min.js
static/js/jquery-ui-1.12.1.min.js
static/css/main.css
static/img/ (some .pngs and some .jpgs)

编辑:添加我的 build.gradle 文件:

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

group = 'com.familam.learning'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-hateoas'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'org.postgresql:postgresql'
    annotationProcessor 'org.projectlombok:lombok'
//  annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

test {
    useJUnitPlatform()
}

提前感谢您的任何见解!如果我需要添加任何进一步的信息,我很乐意。我缺少的可能很简单的事情是什么?

【问题讨论】:

  • 如果我只是无知,请原谅我。为什么你在谈论两个不同的jar文件?为什么不能将你知道的所有正确内容的 jar 文件部署到 Docker?是什么让 Docker 版本与众不同,为什么?
  • 我会考虑查看 Jib 或 Spring 的 Docker 支持,而不是使用硬编码的 JAR 版本维护自己的 Dockerfile。否则,请出示您的 Maven/Gradle 构建脚本
  • @Steve 我想你的问题正是我想知道的——为什么它们不同。我认为我正在将它直接部署到 Docker 中。我很困惑为什么当我单独解压缩它们(使用 CLI 访问 Docker 中的那个)时,它们是不同的。
  • @OneCricketeer Gradle 脚本已添加,谢谢!我现在开始研究 Jib 和 Spring 的 Docker 支持。谢谢!
  • 嗯,似乎我所做的任何改变都没有什么不同。是否有可能每次都重复使用相同的图像,而不是使用重新构建的 jar 并创建新图像?也许我错过了一个命令。我输入的只是:'docker-compose up',ctr-c 杀死它,然后'docker-compose down' 删除它。我应该在那里做其他事情来创建新图像吗?

标签: java spring-boot docker static-files


【解决方案1】:

我的问题不在于我的配置,而在于我对 docker-compose 的工作原理一无所知。 docker-compose 命令“up”不会重新构建 docker 映像。您需要先运行“docker-compose build”命令。这就是我所缺少的。

【讨论】:

  • 或者,您可以同时完成这两项工作:docker-compose up --build
  • 但在实际操作中,最好还是做docker-compose build && docker-compose up --force-recreate,这样在上一个版本还在运行的时候重建镜像……尽可能减少下线时间。
  • 感谢您的提示!
猜你喜欢
  • 1970-01-01
  • 2021-11-03
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2014-02-07
  • 2018-11-07
  • 1970-01-01
相关资源
最近更新 更多