2016-07-18 140 views
7

Sono confuso su come utilizzare il volume dati denominato (non il contenitore dati).Il volume denominato Docker non si aggiorna

Ho un volume di dati con nome app_src montato su /usr/src/app utilizzando il file di composizione docker. Tuttavia, dopo aver apportato modifiche al mio codice sorgente (localmente), la creazione dell'immagine non aggiorna il volume.

sto costruendo l'immagine in questo modo,

docker-compose -f development.yml build ed eseguirlo docker-compose -f development.yml up -d.

Per confermare che il volume non cambia, l'ho collegato al contenitore in esecuzione e, a dire il vero, il codice sorgente non è aggiornato.

Ecco la mia finestra mobile comporre il file development.yml e Dockerfile per il servizio web. versione: '2'

services: 
    web: 
    restart: always 
    build: ./web 
    expose: 
     - "8000" 
    volumes: 
     - app_src:/usr/src/app 
    links: 
     - postgres:postgres 
    env_file: development.env 
    command: ./start_web.sh 

volumes: 
    app_src: {} 


FROM python:3.4.4 

WORKDIR /usr/src/app 
RUN rm -rf /usr/src/app/* 
COPY . /usr/src/app/ 
RUN pip install --no-cache-dir -r requirements.txt 

ho potuto farlo funzionare montando il padrone di casa in questo modo,

volumes: 
    - ./web/src:/usr/src/app 

Sono su Ubuntu 16.04 in esecuzione finestra mobile 1.11.2. La mia comprensione è sbagliata? Ho dato un'occhiata alla documentazione ma ho trovato tutto ciò che spiegava il volume davvero bene.

risposta

7

Sembra che tu stia cercando di utilizzare docker-compose con un montaggio del volume con nome e un Dockerfile per modificare il contenuto di quella posizione. Questo non funzionerà perché il Dockerfile sta creando un'immagine. La finestra mobile-compose sta definendo il contenitore in esecuzione che viene eseguito sopra quell'immagine. Non sarà possibile modificare il volume all'interno della creazione dell'immagine poiché tale volume viene montato solo dopo che l'immagine è stata creata e si esegue il contenitore.

Se si desidera aggiornare il volume denominato, si consideri un contenitore di lato:

docker run -v app_src:/target -v `pwd`/web/src:/source --rm \ 
    busybox /bin/sh -c "tar -cC /source . | tar -xC /target" 

È possibile eseguire tale container su richiesta per aggiornare il volume denominato. Puoi anche sostituire il tar con qualcosa come un git clone da estrarre da un repository di origine, o anche un rsync (che avresti bisogno di installare sulla tua immagine) se stai apportando piccole modifiche a un grande repository.

È inoltre possibile aggirare il problema svuotando il volume denominato (rm -rf/vol/dir o rimuovendo il volume e creando uno nuovo) e quindi riavviando il contenitore. All'avvio del contenitore, se è incluso un volume con nome vuoto, il valore predefinito è copiare il contenuto dell'immagine in quella posizione nel volume.

+0

Ok, questo ha senso. Ero un po 'confuso su come si costruisce con la composizione. C'è un modo per svuotare il volume denominato da docker-compose quando si attiva il servizio? 'docker-compose up' -> Voglio cancellare la vol dir e copiare l'ultimo file dall'host? –

+0

Non funzionerebbe per eliminare la directory all'inizio del contenitore poiché ciò accadrebbe dopo che Docker ha verificato la presenza di una cartella vuota. Se stai cercando di avere sempre questo inizializzato con il contenuto del contenitore, e non ti dispiace cancellare il volume precedente, devo chiederti se ne hai davvero bisogno come volume? – BMitch

+0

hai ragione. La mia soluzione ora è quella di rimuovere il volume tutti insieme e montarlo dal file host durante lo sviluppo. Ho il volume al primo posto perché ho pensato di condividere il codice in più contenitori, ma ora non ha senso farlo. –

1

si monta il volume più volte nello stesso punto. Il contenitore per la prima volta memorizza i dati nel file system Host, la seconda volta sostituisce i dati nel contenitore INTO dal file system host. montaggio volume di rimuovere da voi finestra mobile-composizione di file

volumes: - ./web/src:/usr/src/app #remove this!

è possibile ottenere ulteriori informazioni here

$ docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

Questo comando monta il directory host,/src/webapp, nella contenitore in/opt/webapp. Se il percorso/opt/webapp esiste già all'interno dell'immagine del contenitore, la sovrapposizione di/src/webapp si sovrappone ma non rimuove il contenuto preesistente. Una volta rimosso il supporto, il contenuto è nuovamente accessibile. Questo è coerente con il comportamento previsto del comando mount.

+0

Non ho montato il volume molte volte. Posso farlo funzionare montando il file system host nel volume. Penso di capire cosa sta succedendo, su build, il contenuto dell'host viene copiato nell'immagine. Ma poi, sto montando il volume che ha dati esistenti, in modo da ombreggiare il file che è stato copiato nell'immagine. Funziona come un normale 'mount'. Penso che quello che mi ha confuso era che pensavo che il "mount" fosse fatto prima che l'immagine fosse costruita, il che è sbagliato. –