我使用docker-compose进行部署,使用2 docker-compose.yml
设置我在本地构建映像并从服务器上的docker hub拉出。
除了构建vs拉图像之外,卷配置也是相同的。
本地:
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"
]
我注意到没有指定驱动程序,并且不确定&#34; rprivate&#34;的重要性,但源和目标确实看起来是正确的。
答案 0 :(得分:4)
问题在于,在 Docker服务启动后,我已将EBS卷安装到/volume
。
目录已安装在容器中,这就是docker inspect
看起来正确的原因,但它安装了预先存在的挂载点,该挂载点由主机自己的挂载重叠。
这个挂载发生在Docker服务启动之后,但是在实际启动任何容器之前很久,所以我没有想到Docker可能不会尊重之前发生的文件系统更改。
解决方案就是重启Docker服务。
答案 1 :(得分:4)
只是想补充一点,如果您正在 Windows 上进行开发,则应明确允许Docker访问您的C:驱动器。在您这样做之前,任何映射的卷都将显示为空。
如果通过Hyper-V(Docker for Windows)运行:
如果通过VirtualBox运行:
VBoxManage sharedfolder add default --name c --hostpath /c --automount
(source)答案 2 :(得分:2)
我建议在服务器上检查/ data / volume上的权限,将它们更改为777临时用于测试是否存在问题。用户服务器也只是一台Linux机器?或者是使用docker-machine或类似的东西创建的虚拟化环境。
您使用的卷不是匿名的,也不是命名的,而是主机挂载的。 docker中没有命令会删除主机安装的卷。
我还建议使用docker run
代替docker-compose
执行相同的操作,以解决docker-compose的问题
问候
答案 3 :(得分:-1)
重启docker也为我解决了安装问题,谢谢!
为了重新启动docker,请使用以下命令:service docker restart
。
这需要花费几秒钟,并且docker应该再次启动。
如果要确保启动,可以运行:service docker status
。