docker
build_error
ai_generated
true
WARNING: Build cache was invalidated by environment variable 'GIT_COMMIT' change.
ID: docker/build-cache-invalidation-due-to-env
85%Fix Rate
82%Confidence
1Evidence
2024-03-05First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| Docker 24.0.6 | active | — | — | — |
| Docker 25.0.2 | active | — | — | — |
Root Cause
Docker build uses --build-arg with a dynamic variable (e.g., git commit hash) that changes each build, causing all subsequent layers to be rebuilt.
generic中文
Docker 构建使用带有动态变量(例如 git 提交哈希)的 --build-arg,该变量每次构建都会更改,导致所有后续层被重建。
Official Documentation
https://docs.docker.com/engine/reference/builder/#argWorkarounds
-
85% success Place the ARG declaration after all stable layers (e.g., after apt-get install) so only final layers are rebuilt, e.g., 'ARG GIT_COMMIT' at the end of Dockerfile.
Place the ARG declaration after all stable layers (e.g., after apt-get install) so only final layers are rebuilt, e.g., 'ARG GIT_COMMIT' at the end of Dockerfile.
-
90% success Use a separate label instruction like 'LABEL git.commit=$GIT_COMMIT' after caching dependencies, keeping build-arg only for metadata.
Use a separate label instruction like 'LABEL git.commit=$GIT_COMMIT' after caching dependencies, keeping build-arg only for metadata.
中文步骤
将 ARG 声明放在所有稳定层之后(例如 apt-get install 之后),以便仅重建最终层,例如在 Dockerfile 末尾放置 'ARG GIT_COMMIT'。
在缓存依赖项之后使用单独的标签指令,如 'LABEL git.commit=$GIT_COMMIT',仅将 build-arg 用于元数据。
Dead Ends
Common approaches that don't work:
-
60% fail
Removing the --build-arg entirely loses the dynamic value needed for labeling or debugging.
-
90% fail
Adding the ARG after RUN commands in Dockerfile still invalidates cache for those layers.