Docker中的Spring Boot静态文件夹

Posted

技术标签:

【中文标题】Docker中的Spring Boot静态文件夹【英文标题】:Spring Boot Static Folder In Docker 【发布时间】:2018-02-01 03:04:28 【问题描述】:

在 Spring Boot 项目中,我必须将默认位置更改为资源文件夹。我使用此代码来实现想要的结果:

@Bean
WebMvcConfigurer configurer () 
    return new WebMvcConfigurerAdapter() 
        @Override
        public void addResourceHandlers (ResourceHandlerRegistry registry) 
            String location = "file:" + System.getProperty("user.dir") + "/pictures/";

            registry.addResourceHandler("/pictures/**").
                    addResourceLocations(location);

            super.addResourceHandlers(registry);
        
    ;

在我的本地机器上一切正常。当创建 docker 映像并运行它时,一切似乎都可以,但是当我尝试请求目录中的一些文件时,它会抛出此异常:

2017-08-23 13:03:48.652 ERROR 8 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

java.net.UnknownHostException: pictures
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) ~[na:1.8.0_144]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_144]
at java.net.Socket.connect(Socket.java:538) ~[na:1.8.0_144]
at sun.net.ftp.impl.FtpClient.doConnect(FtpClient.java:964) ~[na:1.8.0_144]
at sun.net.ftp.impl.FtpClient.tryConnect(FtpClient.java:924) ~[na:1.8.0_144]
at sun.net.ftp.impl.FtpClient.connect(FtpClient.java:1019) ~[na:1.8.0_144]
at sun.net.ftp.impl.FtpClient.connect(FtpClient.java:1005) ~[na:1.8.0_144]
at sun.net.www.protocol.ftp.FtpURLConnection.connect(FtpURLConnection.java:294) ~[na:1.8.0_144]
... more logs (not sure if they are needed to find the problem)

整个stack 的异常。

我检查了图片文件夹是否在 docker 图像中,是的。我不确定是什么导致了这个问题。可以是文件路径之前的file: 吗?我在另一个函数中使用了这个变量System.getProperty("user.dir"),它工作正常,所以它一定不是问题。

Dockerfile

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
RUN mkdir /files
ENV JAVA_OPTS="-Xmx512m -Xss512k"
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

【问题讨论】:

奇怪的是,它从 FTPClient 引发了一个 UnknownHostException,就像它试图与一个名为 pictures 的主机建立 FTP 连接一样。 是的,这就是为什么我在互联网上找不到任何东西并认为它是由 Docker 引起的。 您的代码中是否有一部分尝试进行 FTP 连接,您能否发布它(同时查看堆栈跟踪是否指示您的自定义类之一)。? docker中user.dir的值是多少? 尝试将 "file:" 更改为 "file://" 看看是否有帮助 【参考方案1】:

当您对资源进行本地文件处理时,可以使用两种格式

file:abc/xyzfile:///abc/xyz

file:abc/xyz 表示您想从相对路径 abc/xyz 提供服务。

file:///abc/xyz 表示您要从绝对路径/abc/xyz 提供服务。

在您的情况下,user.dir 可能是 docker 容器内的/,使路径为file://pictures。因此 FTP 处理程序被 Java 激活了

【讨论】:

以上是关于Docker中的Spring Boot静态文件夹的主要内容,如果未能解决你的问题,请参考以下文章

Docker 中的 Spring Boot

Docker 容器中的 Spring Boot 资源

Spring Boot - 如何为指定根目录中的多个路由提供一个静态 html 文件

改进 Docker 中的 Spring-Boot 启动

Spring-boot - Docker Compose - 服务就绪

如何使用 jar 外部的 spring boot 提供静态内容?