You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 11:53:18