Docker中Maven构建失败:maven-resources-plugin报‘Function not implemented’错误
问题:Docker容器内Maven构建maven-resources-plugin报错"Function not implemented"
尝试用Maven和Docker容器化Java Spring Boot应用时,Docker容器内执行maven-resources-plugin的resources步骤持续失败,报错:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources) on project my-app: Function not implemented -> [Help 1]
环境为新托管服务器,已在系统根目录手动安装Docker、Maven和Java。
项目配置
Dockerfile内容
FROM maven:3.9.0-eclipse-temurin-19 AS MAVEN_BUILD COPY pom.xml /build/ COPY src /build/src/ WORKDIR /build/ RUN mvn dependency:resolve RUN mvn clean package -Pdocker FROM eclipse-temurin:19 COPY --from=MAVEN_BUILD /build/target/my-app-1.0-SNAPSHOT.jar /app/ EXPOSE 8082 ENTRYPOINT ["java", "--add-opens", "java.base/java.time=ALL-UNNAMED", "-jar", "/app/my-app-1.0-SNAPSHOT.jar"]
pom.xml内容
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.4</version> </parent> <groupId>com.my.app</groupId> <artifactId>My-App-Service</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <maven.compiler.source>19</maven.compiler.source> <maven.compiler.target>19</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- Include other dependencies as necessary --> </dependencies> <profiles> <profile> <id>docker</id> <properties> <env>docker</env> </properties> </profile> </profiles> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
已尝试的解决方法
- 验证非Docker环境构建正常:
- 本地机器执行
mvn clean package(非Docker环境)可完成。 - 托管服务器非Docker环境执行Maven构建正常。
- 本地Docker化构建无问题。
- 本地机器执行
- 提前解析依赖:在
mvn clean package前添加mvn dependency:resolve步骤,无效。
解决方案
该报错多由Docker存储驱动与服务器文件系统不兼容导致,可按以下步骤排查:
1. 调整Maven构建参数(最小改动)
修改Dockerfile中的Maven构建命令,禁用资源插件的链接特性,改用文件复制:
RUN mvn clean package -Pdocker -Dmaven.resources.useLinking=false
此参数避免maven-resources-plugin使用硬链接/符号链接,绕过不支持的文件系统函数。
2. 检查并切换Docker存储驱动
执行docker info | grep "Storage Driver"查看当前驱动。若为overlay2但服务器文件系统不兼容,可临时切换到vfs驱动:
- 编辑
/etc/docker/daemon.json:{ "storage-driver": "vfs" } - 重启Docker服务:
systemctl restart docker - 重新构建镜像:
docker build -t my-app .
注意:vfs性能较差,仅作临时排查,后续可尝试升级服务器文件系统或调整Docker存储配置。
3. 调整容器目录权限
确保Docker容器对构建目录有完整读写权限,在Dockerfile中添加:
WORKDIR /build/ RUN chmod -R 777 /build/ RUN mvn dependency:resolve RUN mvn clean package -Pdocker
4. 匹配旧服务器的Maven/JDK镜像版本
若旧服务器使用较旧的Maven/JDK镜像,尝试替换Dockerfile中的基础镜像:
FROM maven:3.8.6-eclipse-temurin-17 AS MAVEN_BUILD # 同时调整运行时镜像 FROM eclipse-temurin:17
保持镜像版本与旧服务器一致,避免新镜像的特性依赖问题。
内容的提问来源于stack exchange,提问作者Olive
相关产品推荐
相关产品推荐

