Domanda originale: come utilizzare l'istruzione VOLUME in Dockerfile?
La vera domanda che voglio risolvere è: come montare i volumi host nei container docker in Dockerfile durante la compilazione, ovvero avere la docker run -v /export:/export
capacità durante docker build
.
Il motivo alla base, per me, è quando si costruiscono cose in Docker, non voglio che quelle ( apt-get install
) cache siano bloccate in una singola docker, ma per condividerle / riutilizzarle. Questa è la ragione principale per cui sto ponendo questa domanda.
Ultimo aggiornamento:
Prima della finestra mobile v18.09, la risposta corretta dovrebbe essere quella che inizia con:
C'è un modo per montare un volume durante una compilazione, ma non coinvolge Dockerfile.
Tuttavia, quella era una risposta mal dichiarata, organizzata e supportata. Quando stavo reinstallando la mia finestra mobile contiene, mi è capitato di imbattermi nel seguente articolo:
Dockerize un servizio apt-cacher-ng
https://docs.docker.com/engine/examples/apt-cacher-ng/
Questa è la soluzione del docker per questa / mia domanda, non direttamente ma indirettamente. È il modo ortodosso che docker ci suggerisce di fare. E ammetto che è meglio di quello che stavo cercando di chiedere qui.
Un altro modo è la risposta appena accettata , ad esempio Buildkit in v18.09.
Scegli quello che preferisci.
Era: c'era stata una soluzione: il rocker, che non era di Docker, ma ora che il rocker è stato interrotto, ho riportato di nuovo la risposta su "Non possibile" .
Vecchio aggiornamento: la risposta è "Non possibile". Posso accettarlo come risposta poiché so che il problema è stato ampiamente discusso su https://github.com/docker/docker/issues/3156 . Posso capire che la portabilità è un problema di primaria importanza per gli sviluppatori docker; ma come utente docker, devo dire che sono molto deluso da questa funzione mancante. Consentitemi di chiudere il mio argomento con una citazione da una discussione di cui sopra: " Vorrei usare Gentoo come immagine di base ma sicuramente non voglio che> 1 GB di dati dell'albero di Portage si trovino in uno dei livelli una volta che l'immagine è stata creata. potrebbe avere dei bei contenitori compatti se non fosse per il gigantesco portage tree che doveva apparire nell'immagine durante l'installazione."Sì, posso usare wget o curl per scaricare tutto ciò di cui ho bisogno, ma il fatto che una semplice considerazione sulla portabilità ora mi sta costringendo a scaricare> 1 GB di Portage tree ogni volta che costruisco un'immagine di base Gentoo non è né efficiente né facile da usare. inoltre, il repository dei pacchetti SARÀ SEMPRE in / usr / portage, quindi SEMPRE PORTATILE sotto Gentoo. Ancora una volta, rispetto la decisione, ma per favore mi permetta di esprimere la mia delusione e nel frattempo. Grazie.
Domanda originale in dettaglio:
A partire dal
Condividi le directory tramite i volumi
http://docker.readthedocs.org/en/v0.7.3/use/working_with_volumes/
afferma che la funzionalità dei volumi di dati "è disponibile dalla versione 1 dell'API Docker Remote". La mia finestra mobile è della versione 1.2.0, ma ho riscontrato che l'esempio fornito nell'articolo precedente non funziona:
# BUILD-USING: docker build -t data .
# RUN-USING: docker run -name DATA data
FROM busybox
VOLUME ["/var/volume1", "/var/volume2"]
CMD ["/usr/bin/true"]
Qual è il modo corretto in Dockerfile di montare volumi montati su host in contenitori docker, tramite il comando VOLUME?
$ apt-cache policy lxc-docker
lxc-docker:
Installed: 1.2.0
Candidate: 1.2.0
Version table:
*** 1.2.0 0
500 https://get.docker.io/ubuntu/ docker/main amd64 Packages
100 /var/lib/dpkg/status
$ cat Dockerfile
FROM debian:sid
VOLUME ["/export"]
RUN ls -l /export
CMD ls -l /export
$ docker build -t data .
Sending build context to Docker daemon 2.56 kB
Sending build context to Docker daemon
Step 0 : FROM debian:sid
---> 77e97a48ce6a
Step 1 : VOLUME ["/export"]
---> Using cache
---> 59b69b65a074
Step 2 : RUN ls -l /export
---> Running in df43c78d74be
total 0
---> 9d29a6eb263f
Removing intermediate container df43c78d74be
Step 3 : CMD ls -l /export
---> Running in 8e4916d3e390
---> d6e7e1c52551
Removing intermediate container 8e4916d3e390
Successfully built d6e7e1c52551
$ docker run data
total 0
$ ls -l /export | wc
20 162 1131
$ docker -v
Docker version 1.2.0, build fa7b24f
VOLUME ~/host_dir ~/container_dir
. La discussione è piuttosto ampia, c'è un modo breve per riassumere qual è la ragione?