Comment monter un volume Docker tout en excluant un sous-répertoire
Les volumes Docker fournissent un stockage persistant à vos conteneurs. Les données stockées dans des volumes sont stockées indépendamment des conteneurs afin de pouvoir être restaurées après les redémarrages et les remplacements. Les volumes prennent en charge l’utilisation simultanée de plusieurs conteneurs, ce qui facilite les situations de partage de données.
Le montage d’un volume Docker rend son contenu disponible dans un chemin de répertoire spécifique à l’intérieur du conteneur cible. Tout ce qui se trouve dans l’arborescence du système de fichiers du volume devient accessible. Cela peut créer un défi si vous souhaitez exclure des sous-répertoires spécifiques dans les données de volume. Dans cet article, vous apprendrez une technique simple pour monter des volumes tout en évitant certains chemins.
Sommaire
Pourquoi voudriez-vous faire cela?
Le comportement par défaut de montage du volume entier est normalement souhaitable. Les volumes sont destinés à stocker les données créées par les conteneurs afin que leur contenu soit pertinent pour vos applications.
Les volumes peuvent également être remplis à l’aide de montages liés à l’hôte. Ceux-ci mappent directement un répertoire sur votre machine à un chemin à l’intérieur de votre conteneur. Les modifications apportées dans le répertoire hôte seront automatiquement répercutées dans le conteneur.
Les montages liés sont couramment utilisés pour accélérer le développement d’applications. Vous pouvez modifier le code source et observer vos modifications sans avoir à reconstruire votre image Docker. Les répertoires de travail du projet contiennent souvent des dossiers que vous ne souhaitez pas mettre en miroir, tels que node_modules
et vendor.
Ceux-ci peuvent déjà exister dans votre conteneur, remplis lors des étapes de création d’image. L’exclusion de vos dossiers locaux du montage vous permet de tester votre code de manière fiable à l’aide des dépendances fournies par votre image.
Comment exclure des sous-répertoires des montages de volume Docker
Les sous-répertoires peuvent être exclus d’un montage de volume à l’aide d’une technique simple : créez un autre montage sur le chemin que vous souhaitez ignorer. Si vous montez ~/app
à /opt/app
dans votre conteneur, vous pouvez exclure le ~/app/node_modules
répertoire en montant un second volume vide sur /opt/app/node_modules
:
$ docker run --name app -v ~/app:/opt/app -v /opt/app/node_modules app-image:latest
Ce conteneur commencera avec le contenu de votre hôte ~/app
répertoire accessible sur /opt/app
. Cependant /opt/app/node_modules
contiendra le contenu original fourni par l’image de base, au lieu de celui de votre hébergeur ~/app/node_modules
annuaire.
Cela fonctionne car Docker remplit automatiquement les volumes vides nouvellement créés avec le contenu existant du chemin de destination sur lequel ils sont montés. Si tu cours npm install
dans le cadre de votre Dockerfile, /opt/app/node_modules
contiendra déjà toutes vos dépendances. Le premier montage de volume lie votre répertoire hôte dans le conteneur, mais le second le remplace par un volume vide à /opt/app/node_modules
. Celui-ci est ensuite rempli avec les fichiers et dossiers inclus dans l’image.
L’ordre de vos montages de volume est important – le montage du sous-répertoire doit s’appliquer après la liaison parent moins spécifique. Sinon, le contenu de ~/app
y compris sa version de node_modules
finira par remplacer le volume vide censé créer l’exclusion.
Exclusion de fichiers
Vous pouvez utiliser une technique similaire pour exclure efficacement des fichiers individuels. Montage de votre hôte /dev/null
au chemin du fichier l’effacera, comme s’il n’avait pas de contenu.
$ docker run --name app -v /dev/null:/opt/app/config.yaml app-image:latest
Cela ne fonctionne que pour exclure des fichiers – /dev/null
ne mappera pas sur les chemins de répertoire. La méthode ne fonctionne pas non plus pour omettre un fichier tout en conservant la version originale de votre image de base. Ça va cartographier /dev/null
sur le chemin, en remplaçant tout fichier existant qui s’y trouve.
Utilisation de Docker Compose
Ces techniques fonctionnent également avec Docker Compose. Ajustez la définition de votre service volumes
section pour inclure votre montage de liaison habituel et un remplacement de volume vide approprié.
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
Fonctionnement docker-compose up
aura le même effet que la plaine docker run
exemple ci-dessus.
Sommaire
Les montages de volume Docker remplacent tout dans le chemin de destination du conteneur par le contenu du répertoire hôte lié. Dans certaines situations, vous souhaiterez peut-être personnaliser ce comportement en excluant des chemins d’hôte spécifiques du montage.
Dans cet article, vous avez vu comment le montage d’un volume vide dans un sous-répertoire à l’intérieur du conteneur remplacera la première liaison. Le contenu du sous-répertoire du conteneur reviendra au contenu d’origine fourni par votre image. Une variante de cette technique peut également être utilisée pour les fichiers, bien que le chemin soit remplacé par /dev/null
Au lieu.