无法在Windows上启动Docker MongoDB镜像

32

开始图像时,我遇到了以下错误:

 2019-02-27T17:09:41.095+0000 E STORAGE  [initandlisten] WiredTiger error (17) [1551287381:95206][1:0x7fae36fc4a40], connection: __posix_open_file, 715:
/data/db/WiredTiger.wt: handle-open: open: File exists Raw: [1551287381:95206][1:0x7fae36fc4a40], connection: __posix_open_file, 715: /data/db/WiredTiger.wt: handle-open: open: File exists
2019-02-27T17:09:41.108+0000 I STORAGE  [initandlisten] WiredTiger message unexpected file WiredTiger.wt found, renamed to WiredTiger.wt.6
2019-02-27T17:09:41.111+0000 E STORAGE  [initandlisten] WiredTiger error (1) [1551287381:111166][1:0x7fae36fc4a40], connection: __posix_open_file, 715:
/data/db/WiredTiger.wt: handle-open: open: Operation not permitted Raw: [1551287381:111166][1:0x7fae36fc4a40], connection: __posix_open_file, 715: /data/db/WiredTiger.wt: handle-open: open: Operation not permitted
2019-02-27T17:09:41.149+0000 E STORAGE  [initandlisten] WiredTiger error (17) [1551287381:149030][1:0x7fae36fc4a40], connection: __posix_open_file, 715: /data/db/WiredTiger.wt: handle-open: open: File exists Raw: [1551287381:149030][1:0x7fae36fc4a40], connection: __posix_open_file, 715: /data/db/WiredTiger.wt: handle-open: open: File exists
2019-02-27T17:09:41.153+0000 I STORAGE  [initandlisten] WiredTiger message unexpected file WiredTiger.wt found, renamed to WiredTiger.wt.7
2019-02-27T17:09:41.156+0000 E STORAGE  [initandlisten] WiredTiger error (1) [1551287381:156133][1:0x7fae36fc4a40], connection: __posix_open_file, 715:
/data/db/WiredTiger.wt: handle-open: open: Operation not permitted Raw: [1551287381:156133][1:0x7fae36fc4a40], connection: __posix_open_file, 715: /data/db/WiredTiger.wt: handle-open: open: Operation not permitted
2019-02-27T17:09:41.177+0000 E STORAGE  [initandlisten] WiredTiger error (17) [1551287381:177375][1:0x7fae36fc4a40], connection: __posix_open_file, 715: /data/db/WiredTiger.wt: handle-open: open: File exists Raw: [1551287381:177375][1:0x7fae36fc4a40], connection: __posix_open_file, 715: /data/db/WiredTiger.wt: handle-open: open: File exists
2019-02-27T17:09:41.192+0000 I STORAGE  [initandlisten] WiredTiger message unexpected file WiredTiger.wt found, renamed to WiredTiger.wt.8
2019-02-27T17:09:41.194+0000 E STORAGE  [initandlisten] WiredTiger error (1) [1551287381:194762][1:0x7fae36fc4a40], connection: __posix_open_file, 715:
/data/db/WiredTiger.wt: handle-open: open: Operation not permitted Raw: [1551287381:194762][1:0x7fae36fc4a40], connection: __posix_open_file, 715: /data/db/WiredTiger.wt: handle-open: open: Operation not permitted
2019-02-27T17:09:41.200+0000 W STORAGE  [initandlisten] Failed to start up WiredTiger under any compatibility version.
2019-02-27T17:09:41.200+0000 F STORAGE  [initandlisten] Reason: 1: Operation not permitted
2019-02-27T17:09:41.201+0000 F -        [initandlisten] Fatal Assertion 28595 at src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp 704

.env文件夹的值为

MONGO_SAVE_PATH=./database/db

数据库的Docker文件:

FROM mongo:latest
VOLUME ["/data/db"]
WORKDIR /data
EXPOSE 27017
CMD ["mongod"]

docker-compose.yml中的DB容器

services:
  my-mongo-db:
  build: ./database
  ports:
   - 32815:27017
  volumes:
- ./database/db:/data/db

我不确定如何修复这个问题,但在Linux和Mac上似乎没有出现此问题。

5个回答

40
警告(Windows和OS X):Windows和OS X上的默认Docker设置使用VirtualBox VM来托管Docker守护进程。不幸的是,VirtualBox用于在主机系统和Docker容器之间共享文件夹的机制与MongoDB使用的内存映射文件不兼容(请参见vbox bug,docs.mongodb.org和相关jira.mongodb.org bug)。这意味着无法运行将数据目录映射到主机的MongoDB容器。 docker mongo GitHub的答案 持久保存数据的解决方法:
docker volume create --name=mongodata
docker run -d -p 27017:27017 -v mongodata:/data/db --name=mymongo mongodb:3.3

更多信息 在这里


谢谢您的回复,但我不是使用虚拟盒,而是使用虚拟机。 - David
2
即使在使用Hyper-V的Windows桌面Docker默认发行版的情况下,此答案仍然适用。使用docker volume create命令,问题将得到解决。 - Gordon
有没有一种方法可以更改上面的命令以便与docker-compose一起使用,我遇到了相同的问题:https://dev59.com/arroa4cB1Zd3GeqPhUzf - java12399900

18

如果您正在使用docker-compose,则以下是复制上述答案的方式。

services:
  mongodb_container:
    ...
    volumes:
      - mongodata:/data/db
volumes:
  mongodata:
请注意,上面的示例仅显示了用于mongodb存储的yml文件中所需的部分。

2
嗨,在Windows中,mongodata卷最终映射到哪里? - Paul
谢谢你的回答。我猜如果你想要持久化它们,你只需要手动复制任何文件? - Paul
还有一个问题,数据在docker-compose up运行之间不会保留。 - chill appreciator
1
不要忘记在“services”上面放置“version: '3'”。 - realsarm
1
mongodata:之后应该再加一行空白行,否则compose版本2.3会抛出错误。 - bmabir17
显示剩余4条评论

6

虽然Augustas是正确的,但我发现这个答案在使用docker-compose.yml方面特别有用。

你可以作为一种解决方法:

  1. 在与你的docker-compose文件相同的路径下创建一个.env 文件,并将当前路径保存在环境变量中,像这样:
MONGO_HOST_DATA=/Users/user123/MyMongoProject //path to mongo data folder (for C:\Users\user123\MyMongoProject)

现在,在您的docker-compose文件中,替换上述提到的变量:
    services:
      my-mongo-db:
      build: ./database
      ports:
       - 32815:27017
      volumes:
    - ${MONGO_HOST_DATA}/database/db:/data/db
  • 如果您想查看实际路径替换了环境变量的方式,您可以使用以下命令:
docker-compose config

此外,如果您使用除C:\之外的任何磁盘驱动器,您可能需要更改Docker文件共享设置:

Windows Docker settings window

希望这有所帮助。


嗨,我尝试了这个,但是无法使其工作。我在与docker-compose.yml文件相邻的文件夹中创建了一个名为.env的文件,但仍然无法工作。有没有办法测试是否正在读取.env文件?我在Visual Studio中使用asp.net core。 - Paul
是的,实际上,正如我之前提到的那样,您可以运行 docker-compose config。它应该会显示所有占位符替换为实际值后的实际文件内容。 - Babak
感谢您的帮助。最终我解决了这个问题,但是Mongo仍然会抛出相同的错误。我可以看到它正在写入所有的WiredTiger.wt.2文件(数字在增加)。还有其他可能出错的地方吗? - Paul
这取决于您遇到了什么样的错误。您可以使用 docker logs <container-id-or-name> 命令来检查日志吗? - Babak
1
感谢您的帮助。我创建了一个新问题,以便我可以包含日志文件。https://stackoverflow.com/questions/62345030/unable-to-run-a-mongodb-container-in-docker-for-windows-using-linux-file-system。日志文件重复了我粘贴的行。 - Paul

2

对我来说,这个问题是由于在WSL2上运行Mongo时的NTFS权限引起的。将其转移到ext4(WSL分区)后,问题得到解决。


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Juan Fontes
那正是我的问题所在。我正在WSL下运行我的容器,但使用的是位于本地NTFS驱动器中的文件夹。一旦我在ext4 WSL分区中启动了我的docker环境,一切都像魔法般地运行起来了。 - Geziel Carvalho
这确实对问题提供了一个答案。干得好!我不知道是什么触发了它,因为在我的NTFS分区(/mnt/c/...)上一直都正常工作,直到它出问题了。 - datu-puti

0

虽然问题不完全相同,但我在Ubuntu中简单地启动mongo的Docker容器并尝试将现有目录挂载到容器时看到了相同的错误消息:

docker run --name some-mongo -p 27017:27017 -v $PWD/db-data:/data/db -d mongo

在我的情况下,只有当我尝试从已挂载的硬盘驱动器上的目录运行命令时才会出现错误。我通过将带有/db-data目录的代码库迁移到Ubuntu安装的SSD上来解决了这个问题。

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