2015-12-07 22 views
23

Docker documentation dice che è possibile montare un singolo file in un contenitore Docker:volume del file singolo montato come directory in Docker

Il flag -v può anche essere usato per montare un singolo file - invece di solo directory - dalla macchina host.

$ docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

Questo vi porterà in una shell bash in un nuovo contenitore, avrete la vostra storia bash dall'host e quando si esce dal contenitore, l'ospite avrà la storia dei comandi digitati mentre in Il container.

Quando provo che comunque i monti di file come una directory:

[email protected] ~/project $ docker run --rm -it -v file.json:/file.json test 
total 80K 
drwxr-xr-x 9 root root 4.0K Dec 7 12:58 . 
drwxr-xr-x 63 root root 4.0K Dec 7 12:58 .. 
drwxr-xr-x 2 root root 4.0K Dec 4 16:10 file.json 

mio Dockerfile si presenta così:

FROM ubuntu:14.04 
MAINTAINER Tom 
CMD ["ls", "-lah", "/test"] 

versione Docker è 1.9.1, costruire a34a1d5.

Si tratta di un problema di documentazione, di un malinteso da parte mia o di qualcos'altro?

+1

Leggermente correlato; se la tua password di Windows cambia e non la aggiorni nella finestra mobile per Windows potresti vedere tutti i mounts (file o directory) visualizzati come directory vuote – KCD

risposta

26

test è il nome dell'immagine che è stata creata con 'docker build -t test', non una cartella /test.

Prova un Dockerfile con:

CMD ["ls", "-lah", "/"] 
or 
CMD ["cat", "/file.json"] 

E:

docker run --rm -it -v $(pwd)/file.json:/file.json test 

Nota l'uso di $(pwd) al fine di montare un file con la sua piena percorso assoluto (percorsi relativi non sono supportati)

+0

Grazie, l'ho provato come suggerito, ma mostra una directory vuota. – TTT

+1

@TTT quindi prova con 'CMD [" ls "," -lah "," file.json "]' per vedere il tuo file, o 'CMD [" cat "," /file.json "]' per controllarne il contenuto – VonC

+0

Se faccio 'ls -lah' con solo' file.json' mostra una directory vuota, con 'cat' si dice' cat: file.json: è una directory'. – TTT

15

Ho passato un po 'di tempo a litigare e diagnosticare questo problema con la finestra mobile su Windows. Ciò potrebbe anche influire sulle persone che girano su Mac OSX, quindi aggiungo qui una risposta per le persone che potrebbero avere un problema in quegli ambienti, in quanto la mia ricerca mi ha portato in questo luogo e per aggiungere una spiegazione di ciò che sembra accadere nella finestra mobile.

In Windows o Mac OSX la finestra mobile viene effettivamente eseguita in una macchina virtuale boot2docker e solo la directory degli utenti viene effettivamente condivisa per impostazione predefinita. Su Windows, questa directory utente è condivisa come/c/Users /, tuttavia nella shell MinGW fornita con Docker Machine, è possibile accedere al disco come/C o/c, quindi questo può farvi impazzire se si dimentica che i comandi della finestra mobile sono effettivamente in esecuzione contro la VM boot2docker e i percorsi dei file devono esistere sulla VM boot2docker e devono essere specificati nel modo in cui esistono lì perché ciò che sembra essere presente nella finestra mobile è che invece di dare un avvertimento o un errore che la directory/file fa non esiste, la finestra mobile crea in modo silenzioso la sorgente specificata come directory nella VM di boot2docker, quindi non esiste un output pronto per indicare che si sta facendo qualcosa in modo errato.

Quindi, come nella risposta precedente, se il file è montato come una directory, quindi verificare che si sta fornendo un percorso assoluto. Per Windows e Mac OSX verificare che il percorso assoluto che si sta montando esista nella VM di boot2docker.

+0

Lo stesso sembra essere vero con Docker per Mac. – Lyle

+0

Questa è una risposta utile per gli utenti di docker toolbox! Se si desidera semplicemente aggiungere un file a un contenitore, il comando 'docker cp' può essere utile, come descritto [qui] (http://stackoverflow.com/a/31971697/1747457) – feob

11

Forse questo è chiaro nelle risposte sopra ... ma mi ci è voluto del tempo per capirlo nel mio caso.

Il motivo sottostante che causa la condivisione del file con -v per apparire come directory invece che come file è che Docker non è in grado di trovare il file sull'host. Quindi Docker crea una nuova directory nel contenitore con il nome come nome del file non esistente sull'host in quanto la finestra mobile pensa che l'utente voglia semplicemente condividere una directory/volume che verrà creata in futuro.

Quindi, nel problema riportato sopra, se si è utilizzata una directory relativa nel comando -v e la finestra mobile non comprende le directory relative, ciò significa che il file non è stato trovato nell'host e pertanto la finestra mobile ha creato una directory. E la risposta sopra che suggerisce di usare $ (pwd) sarà la soluzione corretta quando il problema è dovuto ad una directory relativa.

Ma per chi legge questa pagina chi non sta utilizzando una directory relativa e sta avendo lo stesso problema ... quindi cerca di capire perché il file manca sull'host.

potrebbe essere solo un errore di battitura stupido ...

Potrebbe essere che si sta eseguendo il comando "Esegui finestra mobile" da un client, che genera il contenitore finestra mobile su un host diverso e il file viene condiviso fa non esiste su quell'ospite differente Il file che viene condiviso con -v deve esistere nell'host in cui l'agente mobile crea il contenitore ... non necessariamente sul client in cui viene eseguito il comando "docker run -v ..." (anche se saranno uguali in molti casi).

Ci sono altre possibili spiegazioni sopra per Mac e Windows ... potrebbe essere anche questo.

Quindi il file mancante dall'host è il problema ... risolvere il problema nella configurazione ... utilizzando $ (pwd) potrebbe essere la soluzione ma non sempre.

+0

Consigli utili. +1 – VonC

+0

Sì, anzi +1. In certi casi d'uso se il vostro contenitore dovrebbe creare questo file (e non esiste ancora sull'host) questo non funzionerebbe (es. "Finestra mobile run ... -v $ (pwd)/file. json: "creerebbe effettivamente file.json come * * * e non saresti in grado di scrivere dal contenitore poiché non è un * file * ma una * dir *). Per risolvere il problema, assicurati di creare un file file.json * vuoto * prima sull'host con qualcosa come "$ touch file.json" e quindi eseguendo il contenitore. – Koka

0

Esiste una soluzione semplice per coloro che utilizzano la macchina VirtualBox. Per impostazione predefinita, viene aggiunta la cartella C:/User. Se il tuo progetto è in C:/projects, aggiungi questa cartella per renderla disponibile in VB (con automount).

Problemi correlati