Les volumes nommés seront stockés dans le dossier de docker (/var/lib/docker). Si vous souhaitez créer un volume dans un dossier hôte spécifique, utilisez un volume hôte avec la syntaxe suivante :
docker run -v /home/ubuntu/data/app-data:/app-data my-image
Ou depuis votre fichier de composition :
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"
Avec les volumes hôtes, tout contenu du volume à l'intérieur de l'image sera superposé avec le contenu exact du dossier hôte, y compris les UID du dossier hôte. Un dossier hôte vide n'est pas initialisé à partir de l'image comme l'est un volume nommé vide. Les mappages UID ont tendance à être la partie la plus difficile de l'utilisation d'un volume hôte.
Modifier :à partir des commentaires ci-dessous, si vous avez besoin d'un volume nommé qui agit comme un volume hôte, il existe un plug-in de volume persistant local répertorié dans la liste des plug-ins de Docker. Après avoir installé le plugin, vous pouvez créer des volumes qui pointent vers des dossiers hôtes, avec la fonctionnalité que même après avoir supprimé le volume nommé, le répertoire hôte est laissé derrière. Exemple d'utilisation du plug-in :
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
Ils incluent également un fichier de composition v2 avec l'exemple de volume suivant :
volumes:
data:
driver: local-persist
driver_opts:
mountpoint: /data/local-persist/data
Une option supplémentaire dont j'ai été informé au cours du mois dernier consiste à utiliser les options de montage du pilote de volume local pour créer manuellement un montage lié. Ceci est similaire à un volume hôte dans Docker avec les différences suivantes :
- Si le répertoire n'existe pas, la tentative de démarrage d'un conteneur avec un volume nommé pointant vers un montage lié échouera. Avec les volumes hôtes, docker l'initialisera dans un répertoire vide appartenant à root.
- Si le répertoire est vide, un volume nommé initialisera le montage lié avec le contenu de l'image à l'emplacement de montage, y compris la propriété/les autorisations du fichier et du répertoire. Avec un volume hôte, il n'y a pas d'initialisation du contenu du répertoire hôte.
Pour créer un volume nommé en tant que montage lié, vous pouvez le créer à l'avance avec :
docker volume create --driver local \
--opt type=none \
--opt device=/home/user/test \
--opt o=bind \
test_vol
À partir d'une docker run
commande, cela peut être fait avec --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 dans un fichier de composition, vous pouvez créer le volume nommé avec :
volumes:
data:
driver: local
driver_opts:
type: none
o: bind
device: /home/user/test
Ma préférence serait d'utiliser le volume nommé avec le pilote local au lieu du pilote tiers persistant local si vous avez besoin des fonctionnalités de volume nommé.