Como a sintaxe “volumes” do Docker Compose versão 2 deve aparecer?

43

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

O que eu estou tentando fazer é nomear volumes lá e ter um único caminho de referência de volume único no meu disco host local. A seguir, um exemplo, lançando uma exceção com um Traceback que 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/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
  … ?

Até agora, eu li todos os Docker Compor docs master -branch Referência de configuração de volume, o Docker Compor docs Referência de volume / driver de volume e pesquisada Exemplos do GitHub para encontrar a sintaxe correta 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 se parecer?

    
por kaiser 02.03.2016 / 16:16

4 respostas

40

Finalidade da chave volumes

Está lá para criar volumes nomeados .

Se você não usá-lo, você se encontrará com um monte de valores com hash para seus volumes. Exemplo:

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

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

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

Como criar volumes nomeados

A sintaxe docker-compose.yml é:

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

Esse algo como acima mostrava os volumes nomeados.

Como remover volumes em massa

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

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

Editar: Como apontou @ArthurTacca 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, é possível ativá-lo e chamá-lo pelo nome dele :

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

Sidenote: Você pode querer docker-compose down de seus serviços para ter um novo começo antes de criar volumes.

Caso você esteja usando o Boot2Docker / Docker Machine , você precisará docker-machine ssh e sudo -i antes de executar ls -la /mnt/… desse volume - você hospeda machine é a VM provisionada pela Docker Machine .

    
por 09.04.2016 / 16:20
13

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

  • define um nome de volume
  • disponibilizar um volume nomeado em um nome de volume diferente
  • especifica 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 a cada serviço em sua seção volumes: onde montar esse volume.

Aqui está um exemplo muito simples:

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

A entrada global volumes: para project fará com que um volume nomeado project seja criado. Em seguida, ele é montado como /bar em serviço um e como /foo em serviço dois. Ambos os serviços compartilham os dados do volume e podem ler / gravar.

Eu não acho que o que você está tentando fazer é possível (transformando vários caminhos em um único volume e com diferentes sinalizadores de r / w). Se for possível, então provavelmente encontrando uma maneira de criar um volume nomeado com essas propriedades através de outros meios e então adicionando-o como um volume externo:

volumes:
  mymagicvolume:
    external: true
    
por 02.04.2016 / 23:56
5

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

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
$ 
    
por 02.03.2016 / 22:48
5

Acho que o que você está tentando fazer é praticamente o mesmo que foi 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.

A montagem de volumes nomeados foi proposta , mas infelizmente não será adicionada ao núcleo no próximo futuro. No entanto, é possível usar um plug-in do docker chamado local-persist .

    
por 15.06.2016 / 14:20