MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Docker:altere a pasta onde armazenar os volumes do docker


Os volumes nomeados serão armazenados dentro da pasta do docker (/var/lib/docker). Se você deseja criar um volume em uma pasta de host específica, use um volume de host com a seguinte sintaxe:
docker run -v /home/ubuntu/data/app-data:/app-data my-image

Ou do seu arquivo de composição:
version: '2'
services:
    mongo:
        container_name: "CaseBook-db"
        restart: always
        image: mongo:3.2.7
        ports:
            - "27017"
        volumes:
            - /home/ubuntu/data/db:/data/db
        labels:
            - "ENVIRONMENT_TYPE=meteor"

    app:
        container_name: "CaseBook-app"
        restart: always
        image: "meteor/casebook"
        build: .
        depends_on:
            - mongo
        environment:
            - MONGO_URL=mongodb://mongo:27017/CaseBook
        ports:
            - "80:3000"
        volumes:
            - /home/ubuntu/data/uploads:/Meteor-CaseBook-Container/.uploads
        labels:
            - "ENVIRONMENT_TYPE=meteor"

Com volumes de host, qualquer conteúdo do volume dentro da imagem será sobreposto com o conteúdo exato da pasta de host, incluindo UIDs da pasta de host. Uma pasta de host vazia não é inicializada a partir da imagem da mesma forma que um volume nomeado vazio. Os mapeamentos de UID tendem a ser a parte mais difícil do uso de um volume de host.

Edit:a partir dos comentários abaixo, se você precisar de um volume nomeado que atue como um volume de host, há um plug-in de volume persistente local listado na lista de plug-ins do docker. Depois de instalar o plugin, você pode criar volumes que apontam para pastas do host, com o recurso de que mesmo após a remoção do volume nomeado, o diretório do host é deixado para trás. O uso de amostra do plug-in inclui:
docker volume create -d local-persist -o mountpoint=/data/images --name=images
docker run -d -v images:/path/to/images/on/one/ one
docker run -d -v images:/path/to/images/on/two/ two

Eles também incluem um arquivo de composição v2 com o seguinte exemplo de volume:
volumes:
  data:
    driver: local-persist
    driver_opts:
      mountpoint: /data/local-persist/data

Uma opção adicional que tomei conhecimento no mês passado é usar as opções de montagem do driver de volume local para criar manualmente uma montagem de ligação. Isso é semelhante a um volume de host no docker com as seguintes diferenças:
  • Se o diretório não existir, a tentativa de iniciar um contêiner com um volume nomeado apontando para uma montagem de ligação falhará. Com volumes de host, o docker o inicializará em um diretório vazio de propriedade do root.
  • Se o diretório estiver vazio, um volume nomeado inicializará a montagem de ligação com o conteúdo da imagem no local de montagem, incluindo a propriedade/permissões do arquivo e do diretório. Com um volume de host, não há inicialização do conteúdo do diretório de host.

Para criar um volume nomeado como uma montagem de ligação, você pode criá-lo antecipadamente com:
docker volume create --driver local \
  --opt type=none \
  --opt device=/home/user/test \
  --opt o=bind \
  test_vol

De uma docker run comando, isso pode ser feito com --mount :
docker run -it --rm \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
    foo

Ou em um arquivo de composição, você pode criar o volume nomeado com:
volumes:
  data:
    driver: local
    driver_opts:
      type: none
      o: bind 
      device: /home/user/test 

Minha preferência seria usar o volume nomeado com o driver local em vez do driver de terceiros de persistência local se você precisar dos recursos de volume nomeado.