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

dxpyg8gm  于 2023-03-07  发布在  Docker
关注(0)|答案(4)|浏览(191)

我使用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"的意义,但源和目的地看起来是正确的。

fcg9iug3

fcg9iug31#

问题是我在Docker服务启动后将EBS卷挂载到/volume
该目录装载在容器中,这就是docker inspect看起来正确的原因,但它装载了预先存在的装载点,该装载点被主机自己的装载所覆盖。
这个挂载发生在Docker服务启动之后,但在任何容器实际启动之前很久,所以我没有想到Docker可能不遵守早些时候发生的文件系统更改。
解决方案只是重新启动Docker服务。

wooyq4lh

wooyq4lh2#

我只想补充一点,如果您在Windows上进行开发,您应该显式地允许Docker访问您的C:驱动器。在此之前,任何Map的卷都将显示为空。
如果通过Hyper-V(适用于Windows的Docker)运行:

  • 转到设置-〉共享驱动器,选中"C:" (source

如果通过VirtualBox运行:

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

hfwmuf9z3#

我建议在服务器上检查/data/volume的权限,将其更改为777临时,以测试是否存在此问题。另外,用户服务器只是一台Linux机器?或者是一个使用docker-machine创建的虚拟化环境或类似的东西。
您正在使用的卷不是匿名的或命名的,而是主机装载的。在Docker中没有删除主机装载卷的命令。
我还建议使用docker run而不是docker-compose执行相同的过程,以消除docker-compose的问题
问候

b4lqfgs4

b4lqfgs44#

Windows 11操作系统- wsl 2

我在添加volume时遇到了问题(都是通过cli、Dockerfile、docker-compose),例如

version: '3'

services:
  myserver:
    restart: unless-stopped  
    volumes:
      - "./app:/app"

它没有创建卷,我可以通过在dockerfile中运行以下命令进行测试

FROM python:3.7-buster

ENV DEBIAN_FRONTEND noninteractive

CMD ["ls", "/app","-lah"]

这将在运行时仅显示空结果

docker-compose up

解决方案是在卷声明中使用绝对导入而不是相对导入,这样最终的docker-compose将如下所示:

version: '3'

services:
  myserver:
    restart: unless-stopped  
    volumes:
      - "home/user/app:/app"

相关问题