Docker : 3 méthodes pour copier des fichiers de l’hôte vers un conteneur

Infrastructure as Code

Docker : 3 méthodes pour copier des fichiers de l’hôte vers un conteneur

I. Présentation

Dans ce tutoriel, je vous présente 3 manières de copier un fichier vers un conteneur Docker. Chaque méthode correspondra à un cas d’usage spécifique.

La manipulation de conteneurs Docker fait beaucoup appel au transfert de fichiers, qu’il s’agisse de pousser des configurations, des certificats, des clés, et tout un tas d’autres choses. Il faut savoir qu’il existe plusieurs manières pour copier des fichiers de l’hôte vers un conteneur.

Nous allons voir 3 cas de figures : celui d’un conteneur en cours d’exécution, celui de la création d’un conteneur et enfin de la création d’une image Docker.

II. Trois méthodes de copie de fichiers dans Docker

A. Pour un conteneur en cours d’exécution : la commande docker cp

Commençons par la méthode la plus commune et la plus simple afin de copier des fichiers dans un conteneur déjà en cours d’exécution.

Il faut bien sûr commencer par récupérer le chemin local du fichier que nous souhaitons copier, ainsi que l’identifiant du conteneur ciblé. Voici la commande à utiliser : 


Pour avoir un exemple plus concret, relevons la liste des conteneurs en cours d’exécution à l’aide de la commande suivante :


Le conteneur que nous souhaitons cibler ici possède l’ID et le fichier est pour l’instant sur notre hôte à l’emplacement suivant : . Nous voulons copier le fichier dans le dossier de notre conteneur. La commande est simple à utiliser dans ce cas de figure :


Pour vérifier que tout s’est bien passé, nous pouvons ensuite utiliser la commande pour lister le contenu du répertoire de notre conteneur, et valider que notre fichier est bien présent : 


Notez que vous pouvez aussi très bien l’utiliser dans le sens inverse, pour copier un fichier du conteneur vers votre hôte. Par exemple, je souhaite ici copier le fichier de mon conteneur vers le fichier de mon hôte : 


Avec cette commande, nous pouvons copier des fichiers, mais aussi tout un répertoire de notre hôte vers le système de fichiers d’un conteneur, et inversement.


B. Pour un conteneur en cours de création : les bind-mounts Docker

Nous avons également la possibilité, lorsque l’on crée un conteneur, de lui monter un répertoire (ou un fichier) de notre hôte, cela permet de partager rapidement des données, mais surtout de disposer d’un stockage permanent de données. Il ne faut pas oublier qu’un conteneur est temporaire et qu’il ne préserve aucune donnée par défaut.

En montant un répertoire de notre hôte, nous avons donc la possibilité de partager des fichiers entre l’hôte et le conteneur. Cette méthode s’appelle le bind mount et lie directement un répertoire de notre système de fichiers hôte à un répertoire dans le conteneur

Note : Cette méthode fonctionne si l’on crée et monte le volume à la création du conteneur, mais n’est pas utilisable pour un conteneur déjà en cours d’exécution.

Pour l’exemple, nous avons le répertoire sur notre hôte, et celui-ci contient un fichier. Nous allons donc créer un conteneur en lui spécifiant l’option suivante :


Par exemple :


Une fois dans notre conteneur, on retrouve le répertoire et son contenu. Attention, toute modification de son contenu dans le conteneur modifiera également le répertoire/fichier sur l’hôte

Au lieu de monter tout un répertoire, vous pouvez aussi très bien spécifier un unique fichier :


Dans le cas de l’utilisation d’un Docker Compose, nous pouvons utiliser les bind-mounts comme ceci : 


Pour rappel, Docker Compose permet de gérer des applications Docker réparties sur plusieurs conteneurs. Il se présente sous le format d’une commande () et d’un fichier de configuration (souvent nommé ). Pour utiliser ce fichier de configuration en lieu et place de la commande , il faut utiliser la commande suivante :


C. Pour la création d’image Docker : l’instruction COPY de Dockerfile

Si nous souhaitons intégrer certains fichiers dans une image Docker en cours de construction, nous devons utiliser l’instruction du Dockerfile. Cette commande s’utilise comme suit :


Lorsque vous utilisez l’instruction dans un Dockerfile, les chemins des fichiers sont relatifs au contexte de construction. Le contexte de construction est le répertoire à partir duquel vous exécutez la commande . Pour un cas simple, il est donc préférable de positionner ces fichiers dans le même répertoire que le Dockerfile :


Pour l’exemple, nous allons créer une image Docker simple basée sur Alpine, qui n’aura d’ailleurs pour seule particularité de disposer d’un fichier à sa racine. Voici un Dockerfile qui répond à cette description :


Si vous souhaitez copier tout un répertoire local vers le répertoire du conteneur (c’est un exemple), rien de plus simple :


À noter que l’utilisation de wildcard est permise, comme dans le cas suivant :


Les fichiers copiés conservent leurs permissions et leur propriétaire tels qu’ils étaient sur l’hôte. Cependant, dans le conteneur, ces fichiers seront détenus par l’utilisateur par défaut, sauf si vous spécifiez un utilisateur différent dans votre Dockerfile.

Nous pouvons ensuite construire notre image, que nous appellerons ici , avec la commande suivante :


Nous voyons à l’étape 2 que notre a bien été intégré à l’image. Pour vérifier que le fichier a bien été copié, nous pouvons créer un conteneur basé sur cette image et vérifier le contenu :


Cela nous permettra de voir que le fichier est bien présent à la racine du système de fichiers du conteneur.

En plus de l’instruction , Docker propose également l’instruction , qui offre des fonctionnalités supplémentaires comme la décompression automatique des archives et le téléchargement de fichiers depuis des URL. Cependant, pour la simple copie de fichiers, est généralement préféré, car il est plus transparent et évite des comportements inattendus.

III. Conclusion

Nous avons vu dans ce tutoriel trois méthodes pour copier des fichiers de notre hôte local vers un conteneur, qu’il soit en cours d’exécution, de création ou lors de la création d’une image. 

Il existe bien d’autres techniques, notamment si l’on sort du contexte Docker (utilisation de rsync, SSH, etc). Mais, en connaissant ces trois-là, vous devriez pouvoir répondre à la plupart des cas de figures qui se présenteront à vous ! 

N’hésitez pas à jeter un œil à nos autres cours, articles et tutoriels sur Docker et sa sécurité :

SOURCE