我使用docker-compose进行部署,使用2docker-compose.yml
设置,在本地构建映像,然后从服务器上的dockerhub拉入映像。
除了构建映像与拉入映像之外,卷配置是相同的。
本地:
app:
build: .
volumes:
- "/data/volume:/volume"
在服务器上:
app:
image: username/repo:tag
volumes:
- "/data/volume:/volume"
在我的Dockerfile中:
volume /volume
本地我的卷可以很好地挂载到指定目录,应用创建的文件会保存在容器之外。但是在部署服务器上,这种情况不会发生。
文件是无论如何创建的,并且通过部署持久化,即使我的部署脚本运行docker-compose down -v
,它可能会删除容器上的命名卷和匿名卷。
我确信我做错了什么,但我看不出是什么。可能是缓存问题吗?卷配置与初始部署时不一样。
更多信息:
我实际上似乎无法强制映像在两次部署之间丢失。
docker-compose down -v --rmi all --remove-orphans
docker rm $(docker ps -a -q)
docker rmi $(docker images -q)
docker volume rm $(docker volume ls -q)
......我以为这样我就可以重新部署了,然后:
docker pull username/repo:tag
docker-compose build --no-cache --force-rm
docker-compose up -d
...应该在挂载卷中的文件仍然在那里,并且磁盘上的挂载目录中仍然没有任何内容。有什么想法吗?
更多信息
在服务器上运行docker inspect <container>
将生成如下所示的装载配置:
"Mounts": [
"Source": "/data/volume",
"Destination": "/volume",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
]
我注意到没有指定驱动程序,也不确定"rprivate"的意义,但源和目的地看起来是正确的。
4条答案
按热度按时间fcg9iug31#
问题是我在Docker服务启动后将EBS卷挂载到
/volume
。该目录装载在容器中,这就是
docker inspect
看起来正确的原因,但它装载了预先存在的装载点,该装载点被主机自己的装载所覆盖。这个挂载发生在Docker服务启动之后,但在任何容器实际启动之前很久,所以我没有想到Docker可能不遵守早些时候发生的文件系统更改。
解决方案只是重新启动Docker服务。
wooyq4lh2#
我只想补充一点,如果您在Windows上进行开发,您应该显式地允许Docker访问您的C:驱动器。在此之前,任何Map的卷都将显示为空。
如果通过Hyper-V(适用于Windows的Docker)运行:
如果通过VirtualBox运行:
VBoxManage sharedfolder add default --name c --hostpath /c --automount
(source)hfwmuf9z3#
我建议在服务器上检查/data/volume的权限,将其更改为777临时,以测试是否存在此问题。另外,用户服务器只是一台Linux机器?或者是一个使用docker-machine创建的虚拟化环境或类似的东西。
您正在使用的卷不是匿名的或命名的,而是主机装载的。在Docker中没有删除主机装载卷的命令。
我还建议使用
docker run
而不是docker-compose
执行相同的过程,以消除docker-compose的问题问候
b4lqfgs44#
Windows 11操作系统- wsl 2
我在添加
volume
时遇到了问题(都是通过cli、Dockerfile、docker-compose),例如它没有创建卷,我可以通过在dockerfile中运行以下命令进行测试
这将在运行时仅显示空结果
解决方案是在卷声明中使用绝对导入而不是相对导入,这样最终的docker-compose将如下所示: