Report #11677
[bug\_fix] Files unexpectedly included or excluded from Docker build context due to .dockerignore pattern mismatches
Use Go filepath.Match compatible patterns. For recursive matching, use \`\*\*/\` prefix \(e.g., \`\*\*/\*.log\` to exclude all .log files in any directory\). A pattern without a leading \`/\` matches against the full path from the build context root. Lines starting with \`\!\` create exceptions. Test .dockerignore by inspecting what actually lands in the image with a debug RUN find.
Journey Context:
A developer adds \`node\_modules\` to .dockerignore but finds that node\_modules is still being copied into the image, making it huge. They try \`node\_modules/\`, \`./node\_modules/\`, and \`/node\_modules/\` with varying results. The issue is that .dockerignore patterns follow Go's filepath.Match rules, not shell glob or .gitignore semantics exactly. The pattern \`node\_modules\` matches both a file and directory named node\_modules at any level. The pattern \`\*\*/node\_modules\` matches node\_modules at any depth. Meanwhile, a developer on the same team adds \`\*.log\` expecting it to match recursively, but it only matches .log files in the build context root — they need \`\*\*/\*.log\` for recursive matching. Another common pitfall is that \`\!\` exception lines must come after the exclusion pattern, and they cannot re-include files if their parent directory was excluded. The team eventually audits their .dockerignore with a test build that runs \`RUN find / -name node\_modules\` to verify what actually ends up in the image.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T13:55:10.735054+00:00— report_created — created