Docker挂载本地卷失败,显示"no such file or directory"。

5

我正在尝试以以下方式运行我的镜像:

version: '3.8'
services:
  gamit:
    image: myimage
    volumes:
      - app:/app
volumes:
  app:
    driver: local
    driver_opts:
      type: none
      device: ./app
      o: bind

起初我的目标是在我的 docker-compose.yml 文件旁边有一个 app 目录,该目录应从容器内保留一个 app 目录(它已经包含一些重要数据)。 我的部署场景假定此目录在主机上最初为空,然后跟随容器内的更改。当我使用docker compose up 运行它时,我的 docker-compose.yml 旁边的 app 目录仍然为空。我注意到会创建并填充 /var/lib/docker/volumes/myimage/_data 目录,并将来自容器的数据填充进去(我认为我的选项 device:./app 设置了主机目录的位置)。 然后我删除了 /var/lib/docker/volumes/myimage/ 目录,现在它会抛出一个错误: docker failed to mount local volume mount no such file or directory
我的总体目标是最初使用空的 app 目录运行 docker compose up,从容器内填充它,然后在其中保存所有容器内的更改。

通常情况下,您不应更改/var/lib/docker中的任何内容,删除那里的卷目录几乎肯定会导致您现在看到的错误。您可以使用更短的volumes: ['./app:/app']绑定挂载语法吗? - David Maze
这是否属于离题讨论?您可以在serverfault.com上提问。 - user11913484
@DavidMaze 尝试使用更短的 volumes: ['./app:/app'] 绑定挂载语法运行。它在我的 docker-compose.yml 文件附近创建了一个空的 app 目录,并且容器内部的 app 目录变为空了。我的目标是让这个目录包含来自容器内部的数据。 - r69
我终于在这里找到了答案 链接描述 - huy88
1个回答

6
在ubuntu 20.04中,Docker版本为20.10.17,Docker Compose版本为v2.6.0。我尝试使用${PWD}/app来代替./app。就像这样:
version: '3.8'
services:
  gamit:
    image: myimage
    volumes:
      - app:/app
volumes:
  app:
    driver: local
    driver_opts:
      type: none
      device: ${PWD}/app
      o: bind

对我来说它很好用。据我所知,在 Docker 中的本地卷中,您需要具有挂载的绝对路径。${PWD}环境变量显示项目的当前路径。但有时在某些版本的 Docker 或某些版本的 Docker Compose 中,${PWD}可能不起作用!

https://docs.docker.com/engine/install/linux-postinstall/上有适当的信息。


谢谢,添加绝对路径解决了我的问题。 - Nullish Byte
当使用sudo作为docker时,这种方法不起作用,您需要使用绝对路径或手动设置PWD。 - raquelhortab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接