Docker容器重启后Scrapyd项目无法持久化的问题求助
这个问题的核心原因很明确:Docker容器默认的可写文件系统是临时的——当你在容器内部部署Scrapyd项目时,这些数据只会存在于容器的临时层中,容器重启后,这部分临时数据会被彻底清除,回到镜像的初始状态。你说提交容器无效,大概率是提交后没有用新生成的镜像来启动容器,接下来给你两种靠谱的解决方案:
方案1:使用Docker卷挂载Scrapyd数据目录(推荐,符合Docker最佳实践)
这种方法会把Scrapyd存储项目的目录映射到宿主机(你的Windows 10)的本地目录,让数据脱离容器独立存储,容器重启、重建都不会丢失数据。
先确定容器内Scrapyd的项目存储路径
进入运行中的容器,查看Scrapyd的配置文件:docker exec -it <你的容器ID/名称> bash # 查看Scrapyd配置里的关键目录 cat /etc/scrapyd/scrapyd.conf | grep -E "(eggs_dir|projects_dir|items_dir)"通常默认配置下,Scrapyd会把项目的egg包、项目信息存储在
/var/lib/scrapyd目录下(或者你启动Scrapyd时的工作目录下的eggs、projects子目录),记好这个路径。在Windows本地创建持久化目录
比如在D盘创建D:\docker-volumes\scrapyd-data,用来存放Scrapyd的所有项目数据。重新启动容器并挂载卷
用以下命令启动容器,把本地目录挂载到容器内的Scrapyd数据目录:docker run -d -p 6800:6800 -v D:/docker-volumes/scrapyd-data:/var/lib/scrapyd <你的Ubuntu镜像名称>替换
<你的Ubuntu镜像名称>为你原来使用的镜像名,端口根据你的实际映射调整。重新部署Project A
第一次挂载卷启动后,容器内的Scrapyd数据目录是空的,需要重新用scrapyd-deploy部署Project A。之后无论容器怎么重启,数据都会保存在Windows本地的目录里,不会丢失。
方案2:提交容器为新镜像(适合临时测试,不推荐长期使用)
如果你只是临时需要保留项目,不想用卷,可以把部署完项目的容器提交为新镜像,之后用这个新镜像启动容器。
停止当前容器
docker stop <你的容器ID>提交容器为新镜像
docker commit <你的容器ID> my-custom-scrapyd:v1这里
my-custom-scrapyd:v1是你给新镜像起的名字和版本号,可以自定义。用新镜像启动容器
docker run -d -p 6800:6800 my-custom-scrapyd:v1这次启动后,Scrapyd里就会保留你之前部署的Project A了。不过这种方法的缺点是,每次修改项目或者新增项目,都需要重复提交镜像的步骤,维护起来比较麻烦,所以还是推荐方案1。
内容的提问来源于stack exchange,提问作者rstuppi

