Docker镜像构建报错:找不到java-app文件,如何不改目录结构解决?
Docker构建找不到java-app文件的问题解决
目录结构
. ├── docker │ ├── docker-compose.yml │ └── Dockerfile ├── java-app │ ├── pom.xml │ └── src
报错信息
=> [internal] load build context 0.0s => => transferring context: 2B 0.0s => CACHED [2/5] WORKDIR /app 0.0s => ERROR [3/5] COPY java-app/pom.xml /app/ 0.0s => ERROR [4/5] COPY java-app/src /app/src 0.0s ------ > [3/5] COPY java-app/pom.xml /app/: ------ ------ > [4/5] COPY java-app/src /app/src: ------ Dockerfile:8 -------------------- 6 | 7 | # Copy the necessary files to the working directory 8 | >>> COPY java-app/pom.xml /app/ 9 | COPY java-app/src /app/src 10 | -------------------- ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref b1c85d8c-d082-47bf-843c-99a804945668a::o15zbeasfb4ieh2fetvzcczhp4a: "/java-app/pom.xml": not found
原Dockerfile内容
# Use a base image with Java 11 installed FROM eclipse-temurin:11-jdk # Set the working directory inside the container WORKDIR /app # Copy the necessary files to the working directory COPY ../java-app/pom.xml /app/ COPY ../java-app/src /app/src # Build the application RUN ./mvn package -DskipTests # Expose the port on which the application will run EXPOSE 8080 # Start the application CMD ["java", "-jar", "target/your-app.jar"]
问题原因
- Docker构建上下文限制:Docker不允许用
../跳出当前构建上下文访问文件,所有COPY/ADD的路径必须是上下文内的路径。 - 构建命令上下文错误:你应该是在
docker目录下执行的docker build,此时默认上下文是docker目录,里面没有java-app,自然找不到文件。
解决方法(不修改目录结构)
1. 修正Dockerfile
把COPY路径里的../去掉,同时修正Maven命令路径:
# Use a base image with Java 11 installed FROM eclipse-temurin:11-jdk # Set the working directory inside the container WORKDIR /app # Copy the necessary files to the working directory COPY java-app/pom.xml /app/ COPY java-app/src /app/src # Build the application RUN mvn package -DskipTests # Expose the port on which the application will run EXPOSE 8080 # Start the application CMD ["java", "-jar", "target/your-app.jar"]
说明:原命令里的
./mvn改为mvn,因为基础镜像中Maven已经配置到系统PATH,直接调用即可。
2. 执行正确的构建命令
切换到项目根目录(即包含docker和java-app的那个目录),运行:
docker build -f docker/Dockerfile -t your-app-image .
-f docker/Dockerfile:指定Dockerfile的位置(因为它在docker子目录下)-t your-app-image:给镜像设置一个自定义标签(可替换成你想要的名字).:指定构建上下文为当前项目根目录,这样Docker就能访问到java-app文件夹
内容的提问来源于stack exchange,提问作者DarkDead
相关产品推荐
相关产品推荐

