Como a sintaxe Docker Compose versão 2 "volumes" deve parecer?

Com Docker Compose v1. 6. 0+, agora há uma nova sintaxe de arquivo / Versão 2 para o docker-compose.yml arquivo. As alterações incluem uma chave de nível superior separada chamada volumes. Isso permite "centralizar" as definições de volume em um só lugar.

O que estou tentando fazer é nome volumes lá e têm um único caminho múltiplo de referência de volume no meu disco host local. O seguinte é um exemplo, lançando uma exceção com um Traceback isso termina com

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

Exemplo 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/sharemevolumes:  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  … ?

Até agora eu li através de todos os Docker Compose docs master-ramo Referência de configuração de Volume, o Docker Compose docs Volume / Volume - referência do Driver e olhou através Exemplos do GitHub para encontrar a sintaxe correta que é esperada. Parece que ninguém já está usando isso (GitHub) e a documentação está longe de estar completa (docker.com). eu também tentei construir um volume separado como service e referenciá-lo em volumes, mas isso não funciona tão bem. Alguma ideia de como essa sintaxe deve ser?

Objetivo do volumes chave

Está lá para criar volumes nomeados.

Se você fizer nao use-o, então você se encontrará com um monte de valores hash para seus volumes. Exemplo:

$ docker volume ls DRIVER              VOLUME NAMElocal               f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55local               9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d

Com volumes nomeados, você obtém algo como o seguinte:

$ docker volume lslocal               projectname_someconflocal               projectname_otherconf

Como criar volumes nomeados

O docker-compose.yml sintaxe é:

version: '2'services:    app:        container_name: app        volumes_from:            - appconf    appconf:        container_name: appconf        volumes:            - ./Docker/AppConf:/var/www/confvolumes:    appconf:networks:    front:        driver: bridge

Este algo como acima mostrado volumes nomeados.

Como remover volumes a granel

Quando você tem um monte de hashes, pode ser muito difícil de limpar. Aqui está um one-liner:

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

Editar: Como @ ArthurTacca apontou nos comentários, há uma maneira mais fácil de lembrar:

docker volume rm $(docker volume ls -q)

Como obter detalhes sobre um volume nomeado

Agora que você não precisa mais procurar hashes, você pode Continuar e chamá-los por seus … 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: Você pode querer docker-compose down seus serviços para começar de novo antes de criar volumes.

Caso você esteja usando Boot2Docker/ Docker Machine, você terá que docker-machine ssh e sudo -i antes de fazer um ls -la /mnt/… desse volume - sua máquina host é a VM provisionada por Docker Machine.

EDITAR: Outro resposta relacionada sobre volumes nomeados no SO.

Do jeito que eu entendo, você pode usar o global volumes: seção para

  • definir um nome de volume
  • disponibilize um volume nomeado com um nome de volume diferente
  • especifique um driver e opções de driver para um volume nomeado

Os Volumes na seção global serão criados automaticamente, a menos que você especifique external: true. Você ainda precisará informar cada serviço em seu volumes: seção onde montar esse volume.

Aqui está um exemplo muito simples:

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

Global volumes: entrada para project causará um volume nomeado project para ser criado. Em seguida, ele é montado como /bar no serviço um, e como /foo no serviço dois. Ambos os Serviços compartilham os dados do volume e podem ler / gravar.

Não acho que o que você está tentando fazer seja possível (transformar vários caminhos em um único volume e com diferentes sinalizadores r/w). Se é possível, então provavelmente encontrando uma maneira de criar um volume nomeado com essas propriedades por meio de alguns outros meios e, em seguida, adicionando-o como um volume externo:

volumes:  mymagicvolume:    external: true

Eu acho que o que você está tentando fazer é aproximadamente o mesmo que visto aqui. Resumindo: atualmente não é possível criar um volume nomeado que se refira a um ponto de montagem no host. Você pode criar um volume nomeado para compartilhar dados entre contêineres, mas os dados só existirão no próprio volume e desaparecerão quando você excluir o volume.

Montagem volumes nomeados foi proposto, mas infelizmente não será adicionado ao núcleo no futuro próximo. No entanto, é possível usando um plugin docker chamado local-persiste.

Conferir Versão 2 por exemplo, também Referência de configuração de Volume:

Meu exemplo: (Versão 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$