docker-compose卷未安装到主机目录

时间:2016-10-20 14:49:13

标签: docker docker-compose

我使用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;的重要性,但源和目标确实看起来是正确的。

4 个答案:

答案 0 :(得分:4)

问题在于,在 Docker服务启动后,我已将EBS卷安装到/volume

目录已安装在容器中,这就是docker inspect看起来正确的原因,但它安装了预先存在的挂载点,该挂载点由主机自己的挂载重叠。

这个挂载发生在Docker服务启动之后,但是在实际启动任何容器之前很久,所以我没有想到Docker可能不会尊重之前发生的文件系统更改。

解决方案就是重启Docker服务。

答案 1 :(得分:4)

只是想补充一点,如果您正在 Windows 上进行开发,则应明确允许Docker访问您的C:驱动器。在您这样做之前,任何映射的卷都将显示为空。

如果通过Hyper-V(Docker for Windows)运行:

  • 转到设置 - &gt;共享硬盘,请选中“C:”(source

如果通过VirtualBox运行:

  • VBoxManage sharedfolder add default --name c --hostpath /c --automountsource

答案 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