Docker 3 methodes pour copier des fichiers
  • 12 août 2025
  • ComputaSYS
  • 0


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 : 

# Commande générique de copie d’un fichier local vers un conteneur
docker cp /chemin/fichier/local.txt idconteneur:/chemin/vers/fichier/conteneur.txt

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

# Lister les conteneurs en cours d’exécution
$ docker ps

CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS      NAMES
1457d7b24b08   mariadb   “docker-entrypoint.s…”   About a minute ago   Up About a minute   3306/tcp   dazzling_mclean

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

# Copie d’un fichier local vers le dossier /tmp/ d’un conteneur
$ docker cp /home/mickael/Documents/fichier.config 1457d7b24b08:/tmp/

Successfully copied 2.05kB to 1457d7b24b08:/tmp/

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

# Lister le contenu du répertoire /tmp d’un conteneur
$ docker exec 1457d7b24b08 ls -al /tmp

total 3
drwxrwxrwt 1 root root 4096 Jul 21 19:49 .
drwxr-xr-x 1 root root 4096 Jul 21 19:49 ..
-rw-rw-r– 1 1002 1002    5 Jul 21 19:49 fichier.config

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 /tmp/fichier.config de mon conteneur vers le fichier /home/mickael/Documents/fichier.config.backup de mon hôte : 

# Copier d’un fichier du conteneur vers l’hôte local
$ docker cp 1457d7b24b08:/tmp/fichier.config  /home/mickael/Documents/fichier.config.backup

Successfully copied 2.05kB to /home/mickael/Documents/fichier.config.backup

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.

# Copier d’un répertoire local contenant deux fichiers vers un conteneur
$ docker cp /home/mickael/Documents/config 1457d7b24b08:/tmp/

Successfully copied 2.56kB to 1457d7b24b08:/tmp/

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/home/mickael/Documents/config/ sur notre hôte, et celui-ci contient un fichier. Nous allons donc créer un conteneur en lui spécifiant l’option suivante :

-v /chemin/repertoire/local:/chemin/montage

Par exemple :

# Créer un conteneur Docker avec un bind-mount
$ docker run -it –name ma_db -v /home/mickael/Documents/config:/config mariadb sh

# Dans le conteneur : lister les fichiers du répertoire /config
# ls /config
fichier.config

Une fois dans notre conteneur, on retrouve le répertoire /config 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 :

# Créer un conteneur Docker avec un bind-mount sur un fichier
$ docker run -it –name ma_db -v /home/mickael/Documents/config/fichier.config:/config/fichier.config mariadb sh

# Dans le conteneur : vérifier la présence du fichier
# ls /config/fichier.config
/config/fichier.config

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

version: ‘3’
services:
  ma_db:
    image: mariadb
    volumes:
      – /home/mickael/Documents/config/fichier.config:/config/fichier.config

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 (docker compose) et d’un fichier de configuration (souvent nommé docker-compose.yml). Pour utiliser ce fichier de configuration en lieu et place de la commande docker run, il faut utiliser la commande suivante :

# Création de conteneur(s) via un fichier docker-compose.yml
docker compose -f /chemin/vers/docker-compose.yml up

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 COPY du Dockerfile. Cette commande s’utilise comme suit :

# Instruction générique de copie d’un fichier lors de la création d’une image
COPY fichier-local.txt /chemin/vers/fichier/conteneur.txt

Lorsque vous utilisez l’instruction COPY 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 docker build. Pour un cas simple, il est donc préférable de positionner ces fichiers dans le même répertoire que le Dockerfile :

mkdir/tmp/test; cd /tmp/test
touch fichier.config 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 /fichier.config à sa racine. Voici un Dockerfile qui répond à cette description :

FROM alpine
COPY fichier.config /fichier.config

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

FROM alpine
COPY ./configs /data/

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

COPY ./configs/*.config /data/configs/

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 root 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 alpine-config, avec la commande suivante :

# Construction d’une image Docker via docker build
$ docker build -t alpine-config .

Sending build context to Docker daemon   2.56kB
Step 1/2 : FROM alpine
 —> 9234e8fb04c4
Step 2/2 : COPY fichier.config /fichier.config
 —> dce5ac37147f
Successfully built dce5ac37147f
Successfully tagged alpine-config:latest

Nous voyons à l’étape 2 que notre fichier.config 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 :

# Lister les fichiers à la racine du conteneur créé via notre image
$ docker run -it –rm alpine-config ls -la /

total 64
drwxr-xr-x    1 root     root          4096 Jul 24 20:45 .
drwxr-xr-x    1 root     root          4096 Jul 24 20:45 ..
-rwxr-xr-x    1 root     root             0 Jul 24 20:45 .dockerenv
drwxr-xr-x    2 root     root          4096 Jul 15 10:42 bin
drwxr-xr-x    5 root     root           360 Jul 24 20:45 dev
drwxr-xr-x    1 root     root          4096 Jul 24 20:45 etc
-rw-rw-r–    1 root     root             0 Jul 24 20:44 fichier.config

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

En plus de l’instruction COPY, Docker propose également l’instruction ADD, 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, COPY 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é :

Co-fondateur d’IT-Connect.fr.
Auditeur/Pentester chez Orange Cyberdéfense.



Source link

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *