在docker中部署mongodb,报错directory-sync: fdatasync: Invalid argument.

在docker中部署mongodb,数据文件持久化到mac(我本机)中,测试发现,只要将数据文件目录放到docker中就没问题,一旦将文件放到通过docker -v命令挂载过来的文件夹中就回爆出如下错误:

docker启动命令:

docker run -it -v /Usr/happyhour7/code/data:/data mongodb /bin/bash

root@aba9b0873a23:/# mongod --dbpath=/data/db
2017-01-05T08:40:32.211+0000 I CONTROL [initandlisten] MongoDB starting : pid=15 port=27017 dbpath=/data/db 64-bit host=aba9b0873a23
2017-01-05T08:40:32.211+0000 I CONTROL [initandlisten] db version v3.4.1
2017-01-05T08:40:32.211+0000 I CONTROL [initandlisten] git version: 5e103c4f5583e2566a45d740225dc250baacfbd7
2017-01-05T08:40:32.211+0000 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.2g 1 Mar 2016
2017-01-05T08:40:32.211+0000 I CONTROL [initandlisten] allocator: tcmalloc
2017-01-05T08:40:32.211+0000 I CONTROL [initandlisten] modules: none
2017-01-05T08:40:32.211+0000 I CONTROL [initandlisten] build environment:
2017-01-05T08:40:32.211+0000 I CONTROL [initandlisten] distmod: ubuntu1404
2017-01-05T08:40:32.211+0000 I CONTROL [initandlisten] distarch: x86_64
2017-01-05T08:40:32.211+0000 I CONTROL [initandlisten] target_arch: x86_64
2017-01-05T08:40:32.211+0000 I CONTROL [initandlisten] options: { storage: { dbPath: "/data/db" } }
2017-01-05T08:40:32.218+0000 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=489M,session_max=20000,eviction=(threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),
2017-01-05T08:40:32.229+0000 E STORAGE [initandlisten] WiredTiger error (22) 1483605632:229032, connection: /data/db/: directory-sync: fdatasync: Invalid argument
2017-01-05T08:40:32.230+0000 I - [initandlisten] Fatal Assertion 28561 at src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp 264
2017-01-05T08:40:32.230+0000 I - [initandlisten]

*aborting after fassert() failure

我本机:mac,docker系统:ubuntu@14.04

阅读 6.7k
3 个回答

你是直接在MacBook上运行Docker吧?关于Volume官方文档是这样说的:

File sharing

You can decide which directories on your Mac to share with containers.

Add a Directory - Click + and navigate to the directory you want to add.

图片描述

Click Apply & Restart to make the directory available to containers using Docker’s bind mount (-v) feature.

意思是你需要先配置Docker,然后才能使用Volume

参考:
Get started with Docker for Mac

新手上路,请多包涵

这个原因是因为mongodb3.0版本以上默认使用wiredTiger引擎,但是挂载卷不支持这个引擎,所以启动时更换默认的引擎即可,可采用指定引擎为mmapv1。命令行如下:

 ./mongod -port=38200-storageEngine=mmapv1  -dbpath=../data/ -logpath=../log/mongodb.log --logappend --journal

如果要后台运行可以加上fock

./mongod -port=38200 -storageEngine=mmapv1  -dbpath=../data/ -logpath=../log/mongodb.log --logappend --journal --fork

windows系统使用docker运行mongoDB镜像报错

原因
Windows和OS X上的默认Docker设置使用VirtualBox VM来托管Docker守护程序。不幸的是,VirtualBox用于在主机系统和Docker容器之间共享文件夹的机制与MongoDB使用的内存映射文件不兼容(请参阅vbox bug,docs.mongodb.org和相关的jira.mongodb.org错误)【即:MongoDB需要一个支持fsync() 目录的文件系统。但是HGFS和Virtual Box的共享文件夹不支持此操作】。这意味着无法运行映射到主机的数据目录的MongoDB容器。

参考链接:https://hub.docker.com/_/mongo

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题