[ad_1]
Os volumes do Docker fornecem armazenamento persistente para seus contêineres. Os dados armazenados em volumes são armazenados independentemente dos contêineres, para que possam ser restaurados após reinicializações e substituições. Volumes suportam o uso com vários containers simultaneamente, facilitando situações de compartilhamento de dados.
A montagem de um volume do Docker disponibiliza seu conteúdo em um caminho de diretório específico no contêiner de destino. Tudo dentro da árvore do sistema de arquivos do volume pode ser acessado. Isso pode criar um desafio se você desejar excluir subdiretórios específicos nos dados do volume. Neste artigo, você aprenderá uma técnica simples para montar volumes evitando certos caminhos.
Por que você faria isso?
O comportamento padrão de montar o volume inteiro geralmente é desejável. Os volumes destinam-se a armazenar dados criados por contêineres, portanto, seu conteúdo deve ser relevante para seus aplicativos.
Os volumes também podem ser preenchidos usando montagens de link de host. Eles mapeiam diretamente um diretório em sua máquina para um caminho dentro de seu contêiner. As alterações feitas no diretório do host serão refletidas automaticamente no contêiner.
As montagens de ligação são comumente usadas para acelerar o desenvolvimento de aplicativos. Você pode modificar o código-fonte e observar suas alterações sem precisar reconstruir sua imagem do Docker. No entanto, os diretórios de trabalho do projeto geralmente contêm algumas pastas que você não deseja espelhar, como node_modules
S vendor.
Eles podem já existir em seu contêiner, preenchidos durante as etapas de criação da imagem. Excluir suas pastas locais da montagem permite que você teste seu código de forma confiável usando as dependências fornecidas pela sua imagem.
Como excluir subdiretórios das montagens de volume do Docker
Os subdiretórios podem ser excluídos de uma montagem de volume usando uma técnica simples: crie outra montagem no caminho que você deseja ignorar. se você está montando ~/app
uma /opt/app
em seu contêiner, você pode excluir o ~/app/node_modules
diretório montando um segundo volume vazio para /opt/app/node_modules
:
$ docker run --name app -v ~/app:/opt/app -v /opt/app/node_modules app-image:latest
Este contêiner começará com o conteúdo do seu host ~/app
diretório acessível em /opt/app
. Porém /opt/app/node_modules
conterá o conteúdo original fornecido pela imagem base, em vez de seu host ~/app/node_modules
diretório.
Isso funciona porque o Docker preenche automaticamente os volumes vazios recém-criados com o conteúdo existente do caminho de destino em que estão montados. se você correr npm install
como parte do seu Dockerfile, /opt/app/node_modules
ele já conterá todas as suas dependências. A primeira montagem de volume vincula seu diretório de host ao contêiner, mas a segunda o substitui com um volume vazio em /opt/app/node_modules
. Em seguida, ele é preenchido com os arquivos e pastas incluídos na imagem.
A ordem das montagens do volume é importante: a montagem do subdiretório deve ser aplicada após o link primário menos específico. Caso contrário, o conteúdo de ~/app
incluindo sua versão de node_modules
acabará anulando o volume vazio destinado a criar a exclusão.
excluindo arquivos
Você pode usar uma técnica semelhante para excluir arquivos individuais com eficiência. Montando seu host /dev/null
para o caminho do arquivo o deixará em branco, como se não tivesse conteúdo.
$ docker run --name app -v /dev/null:/opt/app/config.yaml app-image:latest
Isso só funciona para excluir arquivos: /dev/null
ele não será mapeado para caminhos de diretório. O método não funciona para pular um arquivo e ao mesmo tempo manter a versão original de sua imagem base. será mapeado /dev/null
no caminho, substituindo quaisquer arquivos existentes que estejam lá.
Usando a composição do Docker
Essas técnicas também funcionam com o Docker Compose. Ajuste sua definição de serviço volumes
seção para incluir sua montagem de link regular e uma substituição de volume vazio adequada.
services: app: image: app-image:latest build: . volumes: - ~/app:/opt/app - /dev/null:/opt/app/config.yaml # Exclude file - /opt/app/node_modules # Exclude directory
Corre docker-compose up
terá o mesmo efeito que o simples docker run
exemplo mostrado acima.
Resumo
As montagens de volume do Docker substituem tudo no caminho de destino do contêiner pelo conteúdo do diretório do host vinculado. Em algumas situações, convém personalizar esse comportamento excluindo a montagem de caminhos de host específicos.
Neste artigo, você viu como montar um volume vazio em um subdiretório dentro do contêiner substituirá o primeiro link. O conteúdo do subdiretório do contêiner será revertido para o conteúdo original fornecido pela sua imagem. Uma variação desta técnica também pode ser usada para arquivos, embora o caminho seja substituído por /dev/null
em vez de.
[ad_2]