必须忽略java本地测试文件和临时缓存,如target/、src/test/、/surefire-reports/、.mvn/、/.class等,防止它们上传污染构建上下文、拖慢构建、破坏缓存或意外混入镜像;需用/directory精确匹配、*跨层级、!取反,并通过docker build --dry-run或上下文字节数变化验证生效。

Java 项目在 Docker 构建时,本地测试文件(如 src/test/、target/surefire-reports/)和临时缓存(如 target/dependency/、.mvn/、**/*.class)若未被过滤,会随构建上下文一并上传——哪怕你最终只 COPY 一个 JAR,它们也白白占用带宽、拖慢构建、污染缓存,甚至意外混入镜像。关键不是“删不删”,而是让 Docker 根本不传它们。
明确哪些 Java 本地产物必须忽略
重点排除三类:开发期产物、测试生成物、构建中间态文件。典型路径包括:
-
target/—— Maven 默认输出目录,含编译类、测试报告、临时依赖,全部不应进上下文 -
src/test/—— 测试源码对运行时无用,且可能含敏感测试配置或 mock 数据 -
**/surefire-reports/、**/failsafe-reports/—— Maven 测试执行后生成的 XML/HTML 报告,体积大且纯属本地调试产物 -
.mvn/—— Maven wrapper 配置目录,仅本地生效,容器内无需 -
**/*.class、**/*.java—— 源码与字节码应由构建阶段统一编译,而非复制进来 -
**/logs/、**/*.log、**/tmp/—— 日志和临时目录常见于本地调试,严禁进入构建流程
写法要准:路径匹配规则不能靠猜
.dockerignore 是 glob 匹配,不是正则,大小写敏感,且所有路径都相对于构建上下文根目录(即 docker build . 所在目录)。正确写法示例:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
-
/target—— 用/开头确保只匹配根目录下的target,避免误伤子模块里同名目录 -
src/test/**—— 递归排除整个测试源码树 -
**/surefire-reports/**—— 跨层级匹配所有 surefire 报告目录 -
!.mvn/wrapper/maven-wrapper.jar—— 若需保留 wrapper jar(某些 CI 场景),用!显式恢复 -
# 忽略所有 class 文件,但保留主启动类所在路径(极少需,慎用)**/*.class!target/classes/com/example/App.class
验证是否真被过滤,别信感觉
光写对不行,得确认 Docker 真没传。两个快速验证方式:
- 执行
docker build --no-cache -t test .,观察日志开头:Sending build context to Docker daemon 12.4MB→ 如果之前是 85MB,说明过滤生效 - Docker 23.0+ 支持
docker build --dry-run .,直接列出实际上传的文件路径,一眼看清target/或src/test/是否还在列表中 - 临时加一行
*到.dockerignore,再构建 —— 若报错failed to solve: failed to read dockerfile: open Dockerfile: no such file or directory,证明.dockerignore正在起作用
配合多阶段构建,双重保险
即使 .dockerignore 没写全,多阶段构建也能兜底。例如:
第一阶段(builder)用完整 JDK + Maven 编译,只 COPY target/*.jar;第二阶段(runner)用 jre-slim,根本不接触 src/ 或 target/ 中的其他内容。这样,即便 .dockerignore 漏掉几个测试资源,也不会出现在最终镜像里。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










