Comment mettre à niveau vers Docker Compose v2
Agence web » Actualités du digital » Comment monter un volume Docker tout en excluant un sous-répertoire

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.

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 ~/appy compris sa version de node_modulesfinira 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.

★★★★★