您已在相对路径中定义了 bind mount(volume),这是不鼓励的。
./data/mongo:/data/db
正如creack in github所提到的那样
不保证数据始终位于此类路径下。
怎么样?让我们假设撰写文件的实际路径是/absolute/path/to/docker-compose.yml。我将目录更改为/absolute/path/to/data/mongo 并执行docker-compose -f ../../docker-compose.yml up -d。在这种情况下,我的 pwd ==> /absolute/path/to/data/mongo 变为 . 并且 docker 创建了 data/mongo,因为该文件夹在此位置不可用。这就是你的情况。
这里:是分隔符,用于分隔主机路径和docker路径。例如:/host/path:/docker/path。这里您在左侧提到的目录/host/path 被绑定为右侧Docker 内部的路径,即/docker/path。不需要创建主机路径和 docker 路径。在这种情况下,docker 在两个位置创建它们。
您甚至可以将卷挂载为只读,在这种情况下,最后使用另一个 : 并使用ro 将其标记为只读. /host/path:/docker/path:ro。这里docker容器只能读取/docker/path(间接/host/path)的文件,不能在该位置写任何东西。
除了挂载主机目录外,您还可以使用相同的方式挂载数据卷。
还有其他类型的卷可用,您可以查看参考以了解其中的一些。除此之外,您还拥有允许安装高级功能的插件,例如安装谷歌驱动器、NFS、...
我建议您 read this 以了解在 docker-compose 中指定卷的更复杂的方法。
我们总是鼓励您提供绝对路径,因为它可以保证位置。
奖金
您还可以将restart:always 添加到您的撰写中,因为这是一个数据库,并且需要始终处于启动状态。 Refer this for other restart-policy options.
解决办法:
所以,你的 docker compose 文件应该是
mongo:
image: mongo:3.6
ports:
- 27017:27017
restart:unless-stopped
volumes:
- /absolute/path/to/data/mongo:/data/db
networks:
- my-api
注意:
如果在容器运行时系统重新启动,添加重启策略也会启动容器。我没有使用restart:always 是有原因的。我鼓励你自己找到它。
参考资料:
-
Use volumes。
- Use bind mounts
-
volumes。
-
Manage data in Docker。
-
Understanding Volumes in Docker。