Come mantenere i file di volume del contenitore Docker?

Vorrei condividere la directory ~/mydir con l'host, ma non sostituire la cartella contenitore Docker con i file host. Quindi, ho docker-compose.yml

 version: '2' services: app: container_name: mono build: . volumes: # save .composer files on host to keep cache warmed up - '/srv/mono/mydir:/root/mydir' command: sleep infinity 

E Dockerfile

 #/bin/bash FROM php:5.6 RUN mkdir /root/mydir && echo '{}' > /root/mydir/myfile.json VOLUME /root/mydir 

Directory /srv/mono/mydir è vuoto. È stato sostituito con la directory host. È chiaro.

Ma come mantenere i file originali?

Ad esempio funziona per i contenitori MySQL Percona:

 version: '2' services: percona-56: container_name: percona-56 image: percona/percona-server:5.6 volumes: - /srv/mysql/percona-56:/var/lib/mysql environment: MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' 

Ci sono file originali dal contenitore:

 $ ll /srv/mysql/percona-56 total 176220 auto.cnf error.log ibdata1 ib_logfile0 ib_logfile1 init.ok mysql performance_schema 

Ho cercato di ispezionare Percona Dockerfile ma non ho trovato qualcosa legato alla condivisione del volume.

 $ docker --version Docker version 1.12.3, build 6b644ec 

Quando si aggiunge un VOLUME all'esecuzione binario, si sta usando il file system host principale anziché il filesystem di copia-scrittura che Docker utilizza per le immagini. Ci sono due opzioni principali qui: 1. Si vince-montare una posizione reale del filesystem nell'image. Questo è ciò che stai facendo qui. 2. Lasciate che Docker gestisca la posizione … in questo caso, Docker crea la posizione sul file system principale e quindi copia il contenuto dell'image in quella posizione per get le cose iniziate.

Stai cercando di get entrambi: vuoi una posizione fissa sul tuo filesystem, ma desideri che i file della tua image siano lì. Ora, c'è un motivo per cui non funziona in questo modo! Cosa succede se 'auto.conf' esiste già in quella cartella e si avvia il contenitore? Cosa succede se si esegue due contenitori con diverse versioni di quel file indicato nella stessa posizione? Ecco perché se scegli una posizione reale, non cerca di indovinare cosa fare con i conflitti tra l'image e il filesystem, va solo con il filesystem.

È ansible get quello che vuoi però. Ci sono davvero due opzioni. Quello migliore sarebbe quello di leggere la tua applicazione da due cartelle separate – quella che è popolata all'interno dell'image e quella che è sul tuo filesystem. Questo evita completamente questo problema;) La seconda opzione è quella di entrare e dire a Docker come gestire singoli file nell'image.

 version: '2' services: app: container_name: mono build: . volumes: # save .composer files on host to keep cache warmed up - '/srv/mono/mydir:/root/mydir' # Marking a volume this way will tell Docker to use THIS file # from the image, even though the parent directory is a regular # volume. If you have an auto.cnf file in your directory, it # will be ignored. - /root/mydir/auto.cnf command: sleep infinity