Come dovrebbe essere la sintassi dei "volumi" di Docker Compose versione 2?


43

Con Docker Compose v1.6.0 +, ora esiste una nuova sintassi / versione 2 per il docker-compose.ymlfile. Le modifiche includono una chiave di livello superiore separata denominata volumes. Ciò consente di "centralizzare" le definizioni di volume in un'unica posizione.

Quello che sto cercando di fare è nominare i volumi lì dentro e avere un singolo percorso di riferimento di volume multiplo sul mio disco host locale. Di seguito è riportato un esempio che genera un'eccezione con un Tracebackche termina con

AttributeError: 'list' object has no attribute 'items'

Esempio docker-compose.yml:

version: '2'

services:
  db:
    image: postgres
    volumes:
      - database:/var/lib/postgres/data

  php:
    image: php-fpm:5.6
    volumes:
      - phpconf:/etc/php/conf.d

  namedvolume:
    container_name: namedvolume
    build: ./Docker/Testvolume
    volumes: 
      - ./Docker/Testvolume/shareme

volumes:
  database:
    - ./Docker/Postgres/db:ro
    - ./Docker/Postgres/ini
  phpconf:
    - ./Docker/PHP-FPM/conf
  singledir: ./Docker/foo
  completemap: ./Docker/bar:/etc/service/conf.d
  - namedvolume:/etc/service/conf.d # < this was a separate attempt w/o the other keys
  … ?

Finora ho letto attraverso tutti i documenti Docker Compose master-branch riferimento configurazione del volume, il Docker Componi docs Volume / di riferimento Volume-driver e guardato attraverso esempi GitHub per trovare la sintassi corretta che ci si aspetta. Sembra che nessuno lo stia già utilizzando (GitHub) e la documentazione è lungi dall'essere completa (docker.com). Ho anche provato a creare un volume separato come servicee fare riferimento in esso volumes, ma non funziona altrettanto. Qualche idea su come dovrebbe apparire questa sintassi?

Risposte:


40

Scopo della volumeschiave

È lì per creare volumi con nome .

Se non lo usi, ti ritroverai con un sacco di valori con hash per i tuoi volumi. Esempio:

$ docker volume ls 
DRIVER              VOLUME NAME
local               f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55
local               9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d

Con i volumi con nome, ottieni qualcosa di simile al seguente:

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

Come creare volumi con nome

La docker-compose.ymlsintassi è:

version: '2'

services:
    app:
        container_name: app
        volumes_from:
            - appconf
    appconf:
        container_name: appconf
        volumes:
            - ./Docker/AppConf:/var/www/conf

volumes:
    appconf:

networks:
    front:
        driver: bridge

Questo qualcosa come sopra ha mostrato volumi denominati.

Come rimuovere i volumi in blocco

Quando hai un sacco di hash, può essere abbastanza difficile da pulire. Ecco un one-liner:

docker volume rm $(docker volume ls |awk '{print $2}')

Modifica: Come sottolineato da @ArthurTacca nei commenti, c'è un modo più facile da ricordare:

docker volume rm $(docker volume ls -q)

Come ottenere dettagli su un volume con nome

Ora che non devi più cercare gli hash, puoi continuare e chiamarli con il loro ...  nome:

docker volume inspect <volume_name>

# Example:
$ docker volume inspect projectname_appconf

[
    {
        "Name": "projectname_appconf",
        "Driver": "local",
        "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/projectname_appconf/_data"
    }
]

Nota a margine: Si potrebbe desiderare di docker-compose downpropri servizi per ottenere un nuovo inizio prima di andare a creare volumi.

Nel caso in cui si utilizzi Boot2Docker / Docker Machine , è necessario docker-machine sshe sudo -iprima di eseguire uno ls -la /mnt/…di quel volume: il computer host è la VM fornita da Docker Machine .


1
ottima risposta. Saluti. Risolto molto tornando per trovare nuovi volumi comporre docker.
Derek Adair,

dove li hai trovati? sembra molto più complicato dei documenti della finestra mobile?
Derek Adair,

1
@DerekAdair Grazie, ma come puoi leggere nelle statistiche in alto a sinistra, questa risposta è ben citata nelle pagine dei risultati del motore di ricerca di Google su questo argomento.
Kaiser

1
Invece di $(docker volume ls |awk '{print $2}')te puoi usare $(docker volume ls -q)Non solo è più semplice, non stampa "VOLUME" sulla prima riga.
Arthur Tacca,

2
Questo non è corretto; questo non fa quello che fa sembrare. volumes_fromè ereditare l'elenco dei volumi da un altro contenitore. Per utilizzare un volume con nome, utilizzare la sintassi del livello di servizio - NAME:DESTe impostare il percorso nella volumeschiave di livello superiore . Quello che fa questo esempio (al momento della stesura di questo) è creare un volume standard oltre a un volume con nome e il volume con nome semplicemente non viene utilizzato.
trevorj,

13

Per come lo capisco, puoi usare la volumes:sezione globale per

  • definire un nome volume
  • rendere disponibile un volume con nome con un nome di volume diverso
  • specificare un driver e le opzioni del driver per un volume denominato

I volumi nella sezione globale verranno creati automaticamente se non specificato external: true. Dovrai comunque indicare a ciascun servizio nella sua volumes:sezione dove montare quel volume.

Ecco un esempio molto semplice:

version: '2'
volumes:
  project:
services:
  one:
    volumes:
      - project:/bar
  two:
    volumes:
      - project:/foo

La volumes:voce globale per projectcauserà la projectcreazione di un volume con nome . Viene quindi montato come /barin servizio uno e come /fooin servizio due. Entrambi i servizi condividono i dati del volume e possono leggerli / scriverli.

Non penso che ciò che stai cercando di fare sia possibile (trasformando più percorsi in un singolo volume e con diversi flag r / w). Se è possibile, probabilmente trovando un modo per creare un volume con nome con queste proprietà attraverso altri mezzi e quindi aggiungendolo come volume esterno:

volumes:
  mymagicvolume:
    external: true

1
Già votato, ma proprio oggi ha trovato il tempo di aggirarlo e ha aggiunto un dato esteso. Grazie per tutto il vostro aiuto! Domanda: Quando si projectnomina il volume e lo si fa riferimento come project:/bar, dove sono projecteffettivamente definiti i percorsi?
Kaiser

docker-compose li creerà automaticamente come volumi con nome in / var / lib / docker / volumi / nome volum
JamesCW

Spiacenti, non capisci ancora dove si trova un docker per un project:alias? Come fa la finestra mobile a sapere se voglio condividere, dire ./some_folder/some_subfolder/yet_another_subfolderal one:e two:contenitori?
Alexander Lomia,

In tal caso si tratta di "progetto: <whateverpath>" sotto i volumi di livello superiore: sezione
Balint Bako

5

Controlla ad esempio la versione 2 , anche il riferimento alla configurazione del volume :

Il mio esempio: (Versione 1)

$ tail -4 docker-compose.yml 
  volumes:
    - ./etc/nginx/conf.d:/etc/nginx/conf.d:ro
    - ./var/log/nginx:/var/log/nginx:rw
    - ./var/www/html:/var/www/html:rw
$ 

1
Questo è esattamente ciò che ho collegato alla domanda e quindi non risponde alla mia domanda. Ti dispiacerebbe pubblicare un esempio di come mappare directory diverse dall'host come volume con nome a più servizi?
Kaiser

il mio link È diverso, indica la Version 2sezione del documento)
alexus

Colpa mia. Ho semplicemente dimenticato di collegare anche quello. Quando guardi le cose YML nella domanda, puoi vedere che ho chiaramente cercato di aggirare usando la volumeschiave di livello superiore separata - cosa che non ho fatto, quindi la domanda. Quello che non capisco è quello che la docker-compose.ymlparte con la sintassi della versione 1 vuole spiegarmi.
Kaiser

5

Penso che quello che stai cercando di fare sia all'incirca lo stesso di quello visto qui . In breve: al momento non è possibile creare un volume con nome che faccia riferimento a un punto di montaggio sull'host. È possibile creare un volume con nome per condividere dati tra contenitori, ma i dati saranno presenti solo nel volume stesso e scompariranno quando si elimina il volume.

È stato proposto il montaggio di volumi con nome , ma sfortunatamente non verrà aggiunto al core nel prossimo futuro. Tuttavia, è possibile utilizzando un plug -in docker denominato local-persist .


3
Montare volumi nominati ora è una cosa ... dall'1.11 o dall'1.12.
Kaiser
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.