如何使用 Spring Boot 在 AWS 上托管的 docker 容器内加载静态文件?

Dam*_*mon 5 static-files amazon-web-services docker spring-boot

我的 SpringBoot 应用程序在一个由 Dockerfile 构建并托管在 AWS ubuntu 实例上的 Docker 容器中运行。一切都工作正常,除了我有一个图像、一个 css 文件和一个 js 文件无法加载。检查页面后,这些文件显示 404 未找到错误。我已使用winscp 将文件上传到我的aws 实例。myApp 文件夹是我的 docker 文件所在的位置以及构建容器的位置。

目录结构是:

myApp
  -Dockerfile
  -target
     -myApp.jar
  -src
     -main
        -java
            -[all my code in respective subdirectories]
        -resources
            -static
               -my.js
               -my.css
               -my.jpg
            -templates
               -folder1
                    -html
                    -html2
               -folder2
                    -html
                    -html2
Run Code Online (Sandbox Code Playgroud)

我几乎可以肯定我的问题出在 docker 容器和我的 dockerfile 上。

Spring Boot 自动在 /src/main/resources/static 中查找静态文件。我想我的 docker 容器没有这个文件结构。

这是我的 Dockerfile

FROM ubuntu:latest

RUN apt-get update && apt-get install -y openjdk-14-jdk

WORKDIR /usr/local/bin/myApp

ADD . /src/main/resources/static

ADD target/myapp.jar .

ENTRYPOINT ["java", "-jar", "myApp.jar"]
Run Code Online (Sandbox Code Playgroud)

当我构建容器时,它显示成功复制和构建的所有内容,但未访问文件。对我来说奇怪的是 Spring Boot 正在从静态文件夹中提供正确的模板。我对此完全不知所措。我尝试从 dockerfile 中单独添加资源,但仍然没有成功。

Mat*_*ava 6

您正在设置WORKDIR,然后.jar使用相对路径复制到该位置,但是当您复制其他内容(/src/main/resources/static)时,您使用的是绝对路径,这完全破坏了您的文件夹结构(因为这些文件不会复制到您的 引用的文件夹中WORKDIR)。您可能忘记了.该路径前面的(点) - ./src/main/resources/static

运行docker exec -it <image-id> bash以访问正在运行的容器并查看复制的内容,如果您不确定,从那时起修复 Dockerfile 中的内容应该很容易。