Docker build使用--no-cache仍命中缓存问题求助
Docker构建
--no-cache仍全命中缓存问题排查与解决 问题描述
执行docker build -t database-local --no-cache .构建镜像时,所有步骤均显示CACHED,即使执行docker builder prune -a、docker system prune -a等缓存清理操作,且docker system df显示所有资源占用为0B,问题依然存在。
相关文件与输出
Dockerfile内容
FROM mcr.microsoft.com/mssql/server:2022-CU10-ubuntu-20.04 AS database ENV ACCEPT_EULA=Y ENV SA_PASSWORD=StackOverflowExamplePassword ARG WORK_DIR=/usr/work USER root COPY /certs /certs RUN cp /certs/*.crt /usr/local/share/ca-certificates/ RUN update-ca-certificates RUN apt update RUN apt install -y dotnet-sdk-6.0 COPY /docker/database/init_db.sh ${WORK_DIR}/init_db.sh COPY /docker/database/entrypoint.sh ${WORK_DIR}/entrypoint.sh COPY /databases /databases USER root RUN apt update RUN apt install -y libunwind8 libicu66 unzip dotnet-sdk-6.0 ADD /docker/database/sqlpackage-linux-x64-en-US-15.0.5084.2.zip ${WORK_DIR}/sqlpackage.zip RUN mkdir ${WORK_DIR}/sqlpackage RUN unzip ${WORK_DIR}/sqlpackage.zip -d ${WORK_DIR}/sqlpackage RUN chmod +x ${WORK_DIR}/sqlpackage/sqlpackage RUN ln -s ${WORK_DIR}/sqlpackage/sqlpackage /usr/bin RUN chmod +x ${WORK_DIR}/init_db.sh RUN chmod +x ${WORK_DIR}/entrypoint.sh USER mssql COPY /docker/database/db_init.sql ${WORK_DIR}/db_init.sql COPY /databases/custom_hierarhies_db/Scripts/Security.sql ${WORK_DIR}/security_patch.sql COPY /databases/custom_hierarhies_db/Scripts/HierarchyWithNodes.TestData.sql ${WORK_DIR}/init_manage_nodes.sql COPY /databases/custom_hierarhies_db/Scripts/InitETLParams.PostDeployment.sql ${WORK_DIR}/init_params.sql COPY /databases/custom_hierarhies_db/Scripts/FillDictionaries.PostDeployment.sql ${WORK_DIR}/data_init.sql COPY /databases/custom_hierarhies_db/Scripts/SourceSelectionSetsView.TestData.sql ${WORK_DIR}/data_init2.sql COPY /databases/custom_hierarhies_db/PostDeployScripts/ ${WORK_DIR}/PostDeployScripts WORKDIR ${WORK_DIR} EXPOSE 1433 # Execute command to expose database to container CMD ["/bin/bash", "entrypoint.sh"]
构建输出片段
... => CACHED [ 2/27] COPY /certs /certs 0.0s => CACHED [ 3/27] RUN cp /certs/*.crt /usr/local/share/ca-certificates/ 0.0s => CACHED [ 4/27] RUN update-ca-certificates 0.0s => CACHED [ 5/27] RUN apt update 0.0s => CACHED [ 6/27] RUN apt install -y dotnet-sdk-6.0 0.0s => CACHED [ 7/27] COPY /docker/database/init_db.sh /usr/work/init_db.sh 0.0s => CACHED [ 8/27] COPY /docker/database/entrypoint.sh /usr/work/entrypoint.sh 0.0s => CACHED [ 9/27] COPY /databases /databases 0.0s => CACHED [10/27] RUN apt update ...
排查与解决步骤
1. 重启Docker服务
缓存可能驻留在Docker守护进程内存中,重启服务可彻底清除:
- Linux:
sudo systemctl restart docker - Windows(PowerShell管理员权限):
Restart-Service Docker - macOS:
brew services restart docker
2. 禁用BuildKit构建
BuildKit的缓存机制与传统Docker构建不同,尝试禁用后再构建:
DOCKER_BUILDKIT=0 docker build -t database-local --no-cache .
3. 重新拉取基础镜像
基础镜像可能被本地其他镜像依赖导致缓存无法清除,重新拉取后再构建:
docker pull mcr.microsoft.com/mssql/server:2022-CU10-ubuntu-20.04 docker build -t database-local --no-cache .
4. 手动清理Docker缓存目录
直接删除BuildKit缓存目录(注意:此操作会清除所有构建缓存,谨慎执行):
- Linux:
sudo rm -rf /var/lib/docker/buildkit - Windows:打开Docker设置 → 资源 → 高级 → 磁盘镜像位置,找到目录后手动删除缓存文件
- macOS:
rm -rf ~/Library/Containers/com.docker.docker/Data/vms/0/data/docker/buildkit
5. Dockerfile指令优化(附带建议)
你的Dockerfile存在重复的apt update和软件安装指令,合并后可减少镜像层,同时避免潜在的缓存问题:
将重复的安装步骤合并为:
RUN apt update && \ apt install -y dotnet-sdk-6.0 libunwind8 libicu66 unzip && \ rm -rf /var/lib/apt/lists/*
这样既减少镜像层数,又能清理apt缓存减小镜像体积。
内容的提问来源于stack exchange,提问作者Niviral
相关产品推荐
相关产品推荐

