MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Docker:Ändern Sie den Ordner, in dem Docker-Volumes gespeichert werden sollen

Benannte Volumes werden im Docker-Ordner (/var/lib/docker) gespeichert. Wenn Sie ein Volume in einem bestimmten Hostordner erstellen möchten, verwenden Sie ein Hostvolume mit der folgenden Syntax:

docker run -v /home/ubuntu/data/app-data:/app-data my-image

Oder aus Ihrer Compose-Datei:

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"

Bei Host-Volumes wird jeder Inhalt des Volumes im Image mit dem genauen Inhalt des Host-Ordners überlagert, einschließlich der UIDs des Host-Ordners. Ein leerer Hostordner wird nicht wie ein leeres benanntes Volume aus dem Image initialisiert. UID-Zuordnungen sind in der Regel der schwierigste Teil bei der Verwendung eines Host-Volumes.

Bearbeiten:Wenn Sie aus den Kommentaren unten ein benanntes Volume benötigen, das als Host-Volume fungiert, gibt es ein lokales persistentes Volume-Plugin, das in der Plugin-Liste von Docker aufgeführt ist. Nach der Installation des Plugins können Sie Volumes erstellen, die auf Hostordner verweisen, mit der Funktion, dass das Hostverzeichnis auch nach dem Entfernen des benannten Volumes zurückbleibt. Die Beispielnutzung des Plugins beinhaltet:

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

Sie enthalten auch eine v2-Compose-Datei mit dem folgenden Volume-Beispiel:

volumes:
  data:
    driver: local-persist
    driver_opts:
      mountpoint: /data/local-persist/data

Eine zusätzliche Option, auf die ich im letzten Monat aufmerksam gemacht wurde, besteht darin, die Mount-Optionen des lokalen Volume-Treibers zu verwenden, um manuell einen Bind-Mount zu erstellen. Dies ähnelt einem Host-Volume in Docker mit den folgenden Unterschieden:

  • Wenn das Verzeichnis nicht existiert, schlägt der Versuch, einen Container mit einem benannten Volume zu starten, das auf einen Bind-Mount zeigt, fehl. Bei Host-Volumes initialisiert Docker es in einem leeren Verzeichnis, das root gehört.
  • Wenn das Verzeichnis leer ist, initialisiert ein benanntes Volume den Bind-Mount mit dem Inhalt des Images am Mount-Speicherort, einschließlich Datei- und Verzeichnisbesitz/Berechtigungen. Bei einem Host-Volume gibt es keine Initialisierung des Inhalts des Host-Verzeichnisses.

Um ein benanntes Volume als Bindungsmount zu erstellen, können Sie es im Voraus erstellen mit:

docker volume create --driver local \
  --opt type=none \
  --opt device=/home/user/test \
  --opt o=bind \
  test_vol

Aus einem docker run Befehl, kann dies mit --mount erfolgen :

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

Oder in einer Compose-Datei können Sie das benannte Volume erstellen mit:

volumes:
  data:
    driver: local
    driver_opts:
      type: none
      o: bind 
      device: /home/user/test 

Ich bevorzuge die Verwendung des benannten Volumes mit dem lokalen Treiber anstelle des lokal persistenten Drittanbietertreibers, wenn Sie die Funktionen des benannten Volumes benötigen.