Com o Docker Compose v1.6.0 +, agora existe 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 ú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 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é 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 service
e referenciá-lo volumes
, mas isso também não funciona. Alguma idéia de como essa sintaxe deve se parecer?
fonte
$(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.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:DEST
e defina o caminho navolumes
chave 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.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:
A
volumes:
entrada global paraproject
fará com que um volume nomeadoproject
seja criado. Em seguida, é montado como/bar
no serviço um e/foo
no 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:
fonte
project
e depois referenciá-lo comoproject:/bar
, onde osproject
caminhos são realmente definidos?project:
alias? Como o docker sabe se eu quero compartilhar, dizer./some_folder/some_subfolder/yet_another_subfolder
para os contêineresone:
etwo:
?Confira a versão 2, por exemplo, também referência de configuração de volume :
Meu exemplo: (Versão 1)
fonte
Version 2
seção do documento)volumes
chave de nível superior separada - o que não fiz, daí a pergunta. O que não entendo é o que adocker-compose.yml
parte da sintaxe da versão 1 deve me explicar.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 .
fonte