Vraag Hoe moet de syntaxis van Docker Compose versie 2 "volumes" eruit zien?


Met Docker Compose v1.6.0 +, er is nu een nieuwe / versie 2 bestandssyntaxis voor de docker-compose.yml het dossier. De wijzigingen bevatten een afzonderlijke naam op het hoogste niveau volumes. Dit maakt het mogelijk de volumedefinities op één plaats te "centraliseren".

Wat ik probeer te doen is naam volumes daarin en hebben een enkelvoudige volumereferentie meerdere pad op mijn lokale hostschijf. Het volgende is een voorbeeld, een uitzondering werpen met een Traceback dat eindigt met

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

Voorbeeld 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
  … ?

Tot dusverre heb ik alle gelezen Docker Compose-documenten master-tak Volume configuratie referentie, de Docker Compose-documenten Volume / Volume-Driver referentie en doorgekeken GitHub voorbeelden om de juiste syntaxis te vinden die wordt verwacht. Het lijkt erop dat niemand dat al gebruikt (GitHub) en de documentatie verre van compleet is (docker.com). Ik heb ook geprobeerd om een ​​apart volume te maken als service en vermeld het in volumes, maar dat werkt niet zo goed. Enig idee hoe deze syntaxis eruit zou moeten zien?


41
2018-03-02 15:16


oorsprong




antwoorden:


Doel van de volumes sleutel

Het is daar om te creëren benoemde volumes.

Als je dat doet niet gebruik het, dan zul je merken dat je een hoop hash-waarden hebt voor je volumes. Voorbeeld:

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

Bij benoemde volumes krijg je ongeveer het volgende:

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

Hoe benoemde volumes te creëren

De docker-compose.yml syntaxis is:

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

Dit zoiets als hierboven is volumes genoemd.

Hoe volumes in bulk te verwijderen

Als je een hoop hashes hebt, kan het behoorlijk moeilijk zijn om op te ruimen. Hier is een one-liner:

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

Bewerk: Zoals @ArthurTacca in de opmerkingen opmerkte, is er een gemakkelijker te onthouden manier:

docker volume rm $(docker volume ls -q)

Informatie over een benoemd volume krijgen

Nu dat je geen hashes meer hoeft op te zoeken, kun je eropuit gaan en ze bij hun ...naam:

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"
    }
]

Kanttekening: Misschien wil je dat docker-compose down uw services om een ​​nieuwe start te krijgen voordat u volumes gaat maken.

In het geval dat u gebruikt Boot2Docker/ Docker Machine, dat zal je wel moeten doen docker-machine ssh en sudo -i voordat je een ls -la /mnt/… van dat volume - je hostmachine is de VM voorzien door Docker Machine.


40
2018-04-09 14:20



heel goed antwoord. gejuich. Er is heel wat opgeruimd om nieuwe docker-compose-volumes te vinden. - Derek Adair
Waar heb je deze gevonden? lijkt veel grondiger dan de dokwerkdocumenten? - Derek Adair
@DerekAdair Bedankt, maar zoals je kunt lezen in de statistieken in de linkerbovenhoek, wordt dit antwoord uitgebreid vermeld in de resultatenpagina's van de Google-zoekmachine over dit onderwerp. - kaiser
In plaats van $(docker volume ls |awk '{print $2}') je kunt gebruiken $(docker volume ls -q) Dit is niet alleen eenvoudiger, het drukt ook "VOLUME" niet af op de eerste regel. - Arthur Tacca
Dit is niet correct; dit doet niet wat het doet lijken. volumes_from is om erven de lijst met volumes van een andere container. Als u een benoemd volume wilt gebruiken, gebruikt u de syntaxis op serviceniveau - NAME:DESTen stel het pad op het hoogste niveau in volumes sleutel. Wat dit voorbeeld doet (op het moment dat dit wordt geschreven) is om een ​​standaardvolume in te stellen toevoeging naar een genoemd volume en het genoemde volume wordt gewoonweg niet gebruikt. - trevorj


Zoals ik het begrijp, kun je de global gebruiken volumes: sectie naar

  • een volumenaam definiëren
  • maak een benoemde volume beschikbaar onder een andere volumenaam
  • specificeer een driver en driver opties voor een genoemd volume

Volumes in het algemene gedeelte worden automatisch gemaakt, tenzij u opgeeft external: true. U moet nog steeds elke service in de zijn volumes: sectie waar dat volume moet worden gemount.

Hier is een heel eenvoudig voorbeeld:

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

Het globaal volumes: invoer voor project veroorzaakt een genoemd volume project om gecreëerd te worden. Het wordt dan gemonteerd als /bar in dienst één, en als /foo in dienst twee. Beide services delen de gegevens van het volume en kunnen deze lezen / schrijven.

Ik denk niet dat wat u probeert te doen mogelijk is (meerdere paden in een enkel volume veranderen, en met verschillende r / w-vlaggen). Als het is mogelijk, dan waarschijnlijk door een manier te vinden om een ​​genoemd volume met deze eigenschappen op een andere manier te creëren en het vervolgens toe te voegen als een extern volume:

volumes:
  mymagicvolume:
    external: true

13
2018-04-02 21:56



Al geaccentueerd, maar vandaag juist tijd gevonden om alles te omzeilen en uitgebreide gegevens toe te voegen. Dank u voor al uw hulp! Vraag: Terwijl u het volume een naam geeft project en dan verwijzen als project:/bar, waar zijn project paden eigenlijk gedefinieerd? - kaiser
docker-compose maakt ze automatisch als benoemde volumes onder / var / lib / docker / volumes / volumenaam - JamesCW
Sorry, begrijp nog steeds niet waar Docker een pad voor krijgt project: alias? Hoe weet Docker of ik iets wil delen, bijvoorbeeld ./some_folder/some_subfolder/yet_another_subfolder naar de one: en two: containers? - Alexander Lomia
In dat geval is het "project: <whateverpath>" onder de volumes op het hoogste niveau: sectie - Balint Bako


Uitchecken Versie 2 bijvoorbeeld ook Volume configuratie referentie:

Mijn voorbeeld: (versie 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
$ 

5
2018-03-02 21:48



Dit is precies wat ik in de vraag heb gekoppeld en daarom beantwoordt ik mijn vraag niet. Zou je een voorbeeld willen geven van hoe verschillende directories van de host als een genoemd volume naar meerdere services kunnen worden toegewezen? - kaiser
mijn link IS anders, het wijst naar Version 2 deel van het document) - alexus
Mijn fout. Ik ben gewoon vergeten die ook te linken. Wanneer je de YML-dingen in de vraag bekijkt, kun je zien dat ik duidelijk geprobeerd heb om het aparte bovenste niveau te gebruiken volumessleutel - wat ik niet deed, vandaar de vraag. Wat ik niet krijg is wat het docker-compose.yml deel met versie 1 syntaxis is bedoeld om me uit te leggen. - kaiser


Ik denk dat wat je probeert te doen ongeveer hetzelfde is als gezien hier. Kort gezegd: het is momenteel niet mogelijk om een ​​benoemd volume te maken dat verwijst naar een koppelpunt op de host. U kunt een benoemd volume maken om gegevens tussen containers te delen, maar de gegevens bestaan ​​alleen in het volume zelf en verdwijnen als u het volume verwijdert.

Het monteren van benoemde volumes is voorgesteld, maar helaas zal dit in de nabije toekomst niet aan de kern worden toegevoegd. Het is echter mogelijk om een ​​docker-plug-in te gebruiken local-aanhouden.


5
2018-06-15 12:20



Het monteren van benoemde volumes  nu is er iets ... sinds 1.11 of 1.12. - kaiser
Het lijkt zo, ja. Bedankt! - Sander