Como é a aparência da sintaxe dos "volumes" do Docker Compose versão 2?

43

Com o Docker Compose v1.6.0 +, agora existe uma nova sintaxe de arquivo / versão 2 para o docker-compose.ymlarquivo. As alterações incluem uma chave de nível superior separada chamada volumes. Isso permite "centralizar" as definições de volume em um único local.

O que estou tentando fazer é nomear volumes e ter um único caminho de referência de volume múltiplo no meu disco host local. A seguir, é apresentado um exemplo, lançando uma exceção com uma Tracebackque 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é o momento, li todas as referências de configuração do Docker Compose docs master-branch Volume, a referência do Docker Compose docs Volume / Volume-Driver e examinei os 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). Também tentei criar um volume separado servicee referenciá-lo volumes, mas isso também não funciona. Alguma idéia de como essa sintaxe deve se parecer?

kaiser
fonte

Respostas:

40

Objetivo da volumeschave

Está lá para criar volumes nomeados .

Se você não o usar, você se encontrará com vários valores de 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 docker-compose.ymlsintaxe é:

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

Isso é algo como o mostrado acima chamado volumes.

Como remover volumes em massa

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

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

Edit: Como o @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, pode prosseguir e chamá-los pelo 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 que docker-compose downseus serviços tenham um novo começo antes de criar volumes.

Caso esteja usando o Boot2Docker / Docker Machine , você precisará docker-machine sshe sudo -iantes de executar um ls -la /mnt/…volume desse tipo - a máquina host é a VM fornecida pela Docker Machine .

kaiser
fonte
1
resposta muito boa Felicidades. Foi esclarecido muito ao voltar para encontrar novos volumes de composição do docker.
Derek Adair
Onde você os encontrou? parece muito mais abrangente do que os documentos do docker?
Derek Adair
1
@DerekAdair Obrigado, mas como você pode ler as estatísticas no canto superior esquerdo, esta resposta está bem referida nas páginas de resultados dos mecanismos de pesquisa do Google sobre este tópico.
Kaiser
1
Em vez de $(docker volume ls |awk '{print $2}')você pode usar $(docker volume ls -q)Não apenas isso é mais simples, como também não imprime "VOLUME" na primeira linha.
Arthur Tacca
2
Isso não está correto; isso não faz o que faz parecer que faz. volumes_fromé herdar a lista de volumes de outro contêiner. Para usar um volume nomeado, use a sintaxe de nível de serviço - NAME:DESTe defina o caminho na volumeschave de nível superior . O que este exemplo faz (no momento em que escrevemos isso) é criar um volume padrão, além de um volume nomeado, e o volume nomeado simplesmente não é usado.
trevorj
13

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

  • defina um nome de volume
  • disponibilizar 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 a cada serviço em sua 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

A volumes:entrada global para projectfará com que um volume nomeado projectseja criado. Em seguida, é montado como /barno serviço um e /foono serviço dois. Ambos os serviços compartilham os dados do volume e podem lê-los / gravá-los.

Eu 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 de r / w). Se possível, provavelmente encontrando uma maneira de criar um volume nomeado com essas propriedades por outros meios e adicionando-o como um volume externo:

volumes:
  mymagicvolume:
    external: true
enigma
fonte
1
Já foi votado, mas ainda hoje encontrou tempo para contorná-lo e adicionou dados estendidos. Obrigado por toda sua ajuda! Pergunta: Ao nomear o volume projecte depois referenciá-lo como project:/bar, onde os projectcaminhos são realmente definidos?
kaiser
docker-compor automaticamente criá-los como volumes denominados em / var / lib / janela de encaixe / volumes / volumename
JamesCW
Desculpe, ainda não entendo de onde o docker encontra um caminho para o project:alias? Como o docker sabe se eu quero compartilhar, dizer ./some_folder/some_subfolder/yet_another_subfolderpara os contêineres one:e two:?
Alexander Lomia
Nesse caso, é "projeto: <whateverpath>" sob os volumes de nível superior: seção
Balint Bako
5

Confira a 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
$ 
alexus
fonte
1
Foi exatamente isso que vinculei na pergunta e, portanto, não responde à minha pergunta. Você se importaria de publicar um exemplo de como mapear diretórios diferentes do host como um volume nomeado para vários serviços?
kaiser
meu link é diferente, ele aponta para Version 2seção do documento)
alexus
Minha culpa. Eu simplesmente esqueci de vincular esse também. Quando você olha o material YML na pergunta, pode ver que eu claramente tentei usar a volumeschave de nível superior separada - o que não fiz, daí a pergunta. O que não entendo é o que a docker-compose.ymlparte da sintaxe da versão 1 deve me explicar.
kaiser
5

Eu acho que o que você está tentando fazer é aproximadamente o mesmo que é visto aqui . Em resumo: 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 existirão apenas 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 em um futuro próximo. No entanto, é possível usando um plug - in docker chamado local-persist .

Sander
fonte
3
Montar volumes nomeados agora é uma coisa … desde 1.11 ou 1.12.
Kaiser #