java - Docker 中的 Spring Boot 静态文件夹

标签 java spring spring-mvc docker spring-boot

在 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" ]

最佳答案

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

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

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

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

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

关于java - Docker 中的 Spring Boot 静态文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45841149/

相关文章:

java - 为什么我无法从模型中检索属性,但可以从 JSP 中检索属性?

java - 如何在 Web API 中使用 Spring Security?

java - Spring Boot Multi-Module maven项目重新打包失败

java - 如何将 XML 转换为 MessageElement[] Java

Java 小程序错误

java - 解压缩/提取 Spring Tools Suite 下载的 Zip/Jar 文件时出错

java - Spring MVC 和 freemarker java 注解配置

java - 在 Tomcat 10 上部署 Spring MVC 5 ... 部署问题

java - 带有 SequenceGenerator 和 generatedValue 的 JPA

java - 使用 Stream API 的对象的 Sum 属性