Docker non può avviare MongoDb con il volume allegato tramite contenitore solo dati

Sto cercando di eseguire una docker-compose sulla mia macchina Windows che genera un'istanza di MongoDB e un contenitore solo dati che proxy un volume allegato contenente i file di database.

 mongodata: image: mongo:2.6.8 volumes: - ./data/db:/data/db command: --break-mongo mongo: image: mongo:2.6.8 volumes_from: - mongodata ports: - "27017:27017" command: --smallfiles --rest 

* ps il command -break-mongo è finalmente in quanto è sufficiente creare il volume

A mio avviso, utilizzando un model di volume a data-only gestire i problemi di authorization ma posso vedere il seguente errore durante l'avvio del contenitore Mongo:

  [0m2016-01-26T00:23:52.340+0000 [initandlisten] info preallocateIsFaster couldn't run due to: couldn't open file /data/db/journal/tempLatencyTest for writing errno:1 Operation not permitted; returning false [0m2016-01-26T00:23:52.341+0000 [initandlisten] Unable to remove temporary file due to: boost::filesystem::remove: Text file busy: "/data/db/journal/tempLatencyTest" [0m2016-01-26T00:23:52.344+0000 [initandlisten] exception in initAndListen: 13516 couldn't open file /data/db/journal/j._0 for writing errno:1 Operation not permitted, terminating 

Pertanto non sono in grado di utilizzare MongoDb con un volume allegato dalla mia macchina locale. C'è qualche modo intorno a questo problema?

La documentazione afferma

Se si utilizza Docker Machine su Mac o Windows, il Demo da Docker ha solo un accesso limitato al file system OS X o Windows. Docker Machine tenta di condividere automaticamente la directory di utenti / utenti (OS X) o C: \ Users (Windows). Quindi, è ansible montare file o directory su OS X utilizzando.

docker run -v /Users/<path>:/<container path> ...

In Windows, montare le directory utilizzando:

docker run -v /c/Users/<path>:/<container path> ...

Tutti gli altri routes provengono dal filesystem della macchina virtuale. Ad esempio, se si utilizza VirtualBox un'altra cartella disponibile per la condivisione, è necessario eseguire ulteriori operazioni. Nel caso di VirtualBox è necessario rendere la cartella host disponibile come una cartella condivisa in VirtualBox . Quindi, è ansible montarlo utilizzando il flag Docker -v.

In pratica, provare a dare un path completo dalla cartella C:\Users come indicato in precedenza oppure, se non lo puoi fare, fare la cartella host una cartella condivisa in Virtualbox.

Aggiornare

Non c'è bisogno di dare un path completo. docker-compose gestirà. Devi assicurarsi che il tuo docker-compose.yml sia dentro (da qualche parte nella row) della cartella Users . Non può essere in una cartella principale. Se già lo fai, allora dovrai modificare le tue autorizzazioni. Devi dare piena authorization a quella cartella.

Aggiornamento: Controlla l' ultima Docker per Windows e MacOS X.

Più veloce e affidabile: non più VirtualBox! Il motore Docker è in esecuzione in una distribuzione Linux Alpine su una macchina virtuale xhyve su Mac OS X o su un Hyper-V VM su Windows e che VM è gestito dall'applicazione Docker. Non hai bisogno di docker-machine per eseguire Docker per Mac e Windows.

Nota: se Windows richiede Windows 10 Pro per far funzionare come Hyper-V non è incluso in altre versioni.

Per Docker Toolbox precedentemente, sembra che non esista alcuna soluzione su Windows e OS X a causa di VirtualBox. La documentazione sull'image afferma infatti:

AVVERTENZA (Windows e OS X): l'impostazione predefinita di Docker su Windows e OS X utilizza un VirtualMouse VM per ospitare il demone Docker. Purtroppo, il meccanismo che VirtualBox utilizza per condividere le cartelle tra il sistema host e il contenitore Docker non è compatibile con i file mappati di memory utilizzati da MongoDB (vedere bug vbox , docs.mongodb.org e bug correlati jira.mongodb.org ). Ciò significa che non è ansible eseguire un contenitore MongoDB con la directory di dati mappata all'host

Come soluzione alternativa, solo copiamo da una cartella prima che inizia il deamon mongo. Inoltre, nel mio caso non mi import i file di giornale, quindi faccio solo copiare i file di database.

Ho usato questo command nel mio command: bash -c "(rm /data/db/*.lock && cd /prev && cp *.* /data/db) && mongod" docker-compose.yml command: bash -c "(rm /data/db/*.lock && cd /prev && cp *.* /data/db) && mongod" E each volta prima di fermarsi il contenitore che utilizzo: docker exec <container_name> bash -c 'cd /data/db && cp $(ls *.* | grep -v *.lock) /prev'

Nota: / prev è impostato come volume. path/to/your/prev:/prev

Un'altra soluzione è quella di utilizzare mongodump e mongorestore.

  • in docker-compose.yml: command: bash -c "(sleep 30; mongorestore --quiet) & mongod"
  • in terminal: docker exec <container_name> mongodump

Nota: uso il sonno perché voglio assicurarsi che il mongo ha iniziato, e ci vuole un po 'di tempo.

So che questo comport lavoro manuale, ecc, ma sono contento che alless ho ottenuto mongo con i dati esistenti in esecuzione sulla mia macchina Windows 10, e ancora può lavorare sul mio Macbook quando voglio.

(croscopia https://stackoverflow.com/a/42044756/1894856 )