Como montar um volume do Docker ao excluir um subdiretório

0
35


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 ~/appincluindo sua versão de node_modulesacabará 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.