Com o Docker Compose v1.6.0+, agora há uma sintaxe de arquivo nova/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 é nomear volumes lá e ter um único caminho de referência de volume múltiplo em meu disco host local. O seguinte é 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, li todos os documentos do Docker Compose master
-branch Referência de configuração de volume, a referência de Volume/Driver de volume dos documentos do Docker Compose e examinei os exemplos do GitHub para encontrar a sintaxe correta esperada. Parece que ninguém ainda está usando isso (GitHub) e a documentação está longe de estar completa (docker.com). Também tentei criar 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?
Finalidade da
volumes
chaveEle está lá para criar volumes nomeados .
Se você não usá-lo, encontrará vários valores de hash para seus volumes. Exemplo:
Com volumes nomeados, você obtém algo como o seguinte:
Como criar volumes nomeados
A
docker-compose.yml
sintaxe é:Isso é algo como os volumes nomeados mostrados acima.
Como remover volumes em massa
Quando você tem um monte de hashes, pode ser muito difícil de limpar. Aqui está um one-liner:
Edit: Como @ArthurTacca apontou nos comentários, há uma maneira mais fácil de lembrar:
Como obter detalhes sobre um volume nomeado
Agora que você não precisa mais procurar hashes, pode continuar e chamá-los pelo … nome:
Observação: você pode querer que
docker-compose down
seus serviços comecem do zero antes de criar volumes.Caso você esteja usando Boot2Docker / Docker Machine , você terá que
docker-machine ssh
esudo -i
antes de fazer umls -la /mnt/…
desse volume - sua máquina host é a VM provisionada pelo Docker Machine .EDIT: Outra resposta relacionada sobre volumes nomeados em SO .
Pelo que entendi, você pode usar a
volumes:
seção global paraOs 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 suavolumes:
seção onde montar esse volume.Aqui está um exemplo muito simples:
volumes:
A entrada global paraproject
fará com que um volume nomeadoproject
seja 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 lê-los/escrevê-los.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 for possível, provavelmente encontrando uma maneira de criar um volume nomeado com essas propriedades por outros meios e, em seguida, adicioná-lo como um volume externo:
Confira a versão 2 , por exemplo, também referência de configuração de volume :
Meu exemplo: (Versão 1)
Acho que o que você está tentando fazer é mais ou menos o mesmo 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 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 usar um plug-in docker chamado local-persist .