Docker部署Spring Boot应用时提示customer-transactions/excels不存在
问题分析与解决
核心原因
- 路径不匹配:代码中使用相对路径
customer-transactions/excels/,但容器运行时的工作目录(WORKDIR)是/customer-transactions,程序实际会去查找/customer-transactions/customer-transactions/excels/,该路径并不存在。 - Dockerfile冗余与文件夹未同步:第一个
ubuntu构建阶段完全未被后续阶段使用,属于冗余代码;同时build阶段创建的excels文件夹,既没有复制到最终运行容器中,也未在运行阶段重新创建。
具体修复步骤
步骤1:简化并修正Dockerfile
删除无用的第一个构建阶段,同时在运行阶段同步或创建excels文件夹:
FROM maven:3.8.6-openjdk-18 AS build RUN mkdir /usr/src/customer-transactions RUN mkdir -p /usr/src/customer-transactions/excels COPY . /usr/src/customer-transactions WORKDIR /usr/src/customer-transactions RUN mvn clean package -DskipTests FROM openjdk:18.0.1.1 RUN mkdir /customer-transactions # 复制编译好的jar包 COPY --from=build /usr/src/customer-transactions/target/customer-transactions-0.0.1-SNAPSHOT.jar /customer-transactions/ # 两种方式二选一:从build阶段同步excels文件夹,或直接创建 COPY --from=build /usr/src/customer-transactions/excels /customer-transactions/excels # RUN mkdir -p /customer-transactions/excels EXPOSE 8050 WORKDIR /customer-transactions CMD java -jar customer-transactions-0.0.1-SNAPSHOT.jar
步骤2:修正代码中的路径
将代码路径改为与容器工作目录匹配的相对路径:
public void deleteExistingFilesInDirectory() throws IOException { // 容器WORKDIR为/customer-transactions,此路径对应/customer-transactions/excels/ FileUtils.cleanDirectory(new File("excels/")); }
可选:非root用户运行优化
如果需要以非root用户运行应用,可在最后阶段添加权限配置:
FROM openjdk:18.0.1.1 RUN mkdir /customer-transactions RUN groupadd -r tommy && useradd -r -s /bin/false -g tommy tommy COPY --from=build /usr/src/customer-transactions/target/customer-transactions-0.0.1-SNAPSHOT.jar /customer-transactions/ RUN mkdir -p /customer-transactions/excels RUN chown -R tommy:tommy /customer-transactions USER tommy EXPOSE 8050 WORKDIR /customer-transactions CMD java -jar customer-transactions-0.0.1-SNAPSHOT.jar
验证
重新构建镜像并启动容器,程序即可正确识别excels文件夹并执行清空操作。
内容的提问来源于stack exchange,提问作者user564930
相关产品推荐
相关产品推荐

