如何不重建Docker镜像,将宿主机文件更新到镜像内指定目录
解决方案
首先明确你之前操作失败的核心原因:
- Dockerfile中
COPY scrapy to /root/scrapy语法错误,to是多余参数,Docker将其识别为要复制的第二个文件,所以报找不到to文件的错误 - 执行
docker cp时未在源路径末尾加路径分隔符,导致整个scrapy目录被复制到目标路径下形成/root/scrapy/scrapy层级,所以原路径下看不到新内容 - Windows容器的挂载路径格式要求与Linux容器不同,且你本身不接受运行时挂载方案,可忽略该方向
方案1:docker cp + commit (最快,无需修改配置)
操作步骤如下:
- 启动临时后台容器,避免执行完命令直接退出:
docker run -d --name temp_scrapy scrapy ping -t localhost
- 正确执行文件复制,注意源路径末尾加反斜杠,代表复制目录内的所有内容到目标路径:
docker cp D:\Programs\scrapy\ temp_scrapy:/root/scrapy/
- 将修改后的容器提交为新镜像,可直接覆盖原有镜像标签:
docker commit temp_scrapy scrapy:latest
- 清理临时容器:
docker rm -f temp_scrapy
该方案完全复用原有镜像的所有层,仅新增修改层,耗时仅取决于你要复制的文件大小,无需任何重建操作。
方案2:优化分层构建(适合频繁迭代更新)
修正你的分层构建逻辑,后续每次更新仅执行COPY层构建,不会重新构建系统基础层:
- 调整
image_addons目录结构,确保要复制的scrapy目录和Dockerfile在同一级:
D:\Programs\image_addons ├─ Dockerfile └─ scrapy/ (存放所有要更新的scrapy内容)
- 修正Dockerfile B的语法,删除多余的
to参数:
FROM scrapybase COPY scrapy /root/scrapy
- 每次更新scrapy内容后,在
D:\Programs\image_addons目录下执行构建即可:
docker build -t scrapy .
该方案会复用之前构建好的scrapybase基础镜像缓存,仅执行COPY操作,构建速度极快,且构建过程可追溯,适合多次迭代的场景。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

