Copier les fichiers du conteneur Docker vers l'hôte

Isaac Tony 30 janvier 2023
  1. Utilisez docker cp pour copier des fichiers du conteneur Docker vers l’hôte
  2. Utiliser les montages Docker pour copier des fichiers du conteneur Docker vers l’hôte
  3. Utilisez COPY pour copier des fichiers du conteneur Docker vers l’hôte
Copier les fichiers du conteneur Docker vers l'hôte

Avant Docker 1.8, nous pouvions uniquement copier des fichiers du conteneur vers l’hôte. Cependant, à mesure que les conteneurs devenaient de plus en plus populaires, la copie de fichiers vers et depuis des conteneurs est devenue nécessaire.

L’une des raisons courantes pour lesquelles nous pouvons souhaiter copier des fichiers à partir d’un conteneur Docker est de partager des fichiers journaux avec les membres de notre équipe. Cependant, la copie d’informations sensibles telles que les ressources sous /dev, /proc, /sys, tmpfs n’est pas autorisée.

Cet article explique comment copier des fichiers à partir d’un conteneur Docker à l’aide d’un DockerFile, de la commande docker cp et du montage de répertoires sur la machine hôte en tant que volumes.

Cela nécessite d’installer et de configurer correctement Docker et un conteneur Docker. Cela fonctionnera dans les environnements Linux et WSL.

Utilisez docker cp pour copier des fichiers du conteneur Docker vers l’hôte

La commande docker cp est l’un des moyens les plus simples que nous puissions utiliser pour copier des fichiers et des répertoires de notre machine hôte vers un conteneur docker. Nous utiliserons Ubuntu 20.4.5 et la dernière version de Docker à l’époque, qui est la 19.03.

Syntaxe:

$ docker cp [OPTIONS] CONTAINER: SRC_PATH DEST_PATH|-

Où:

  • SRC_PATH spécifie le chemin source où se trouve le fichier que nous voulons copier sur l’hôte.
  • DEST_PATH est le chemin de destination pour stocker le fichier sur le conteneur.

À l’aide de cette commande, nous pouvons copier des fichiers vers et depuis le conteneur en interchangeant les paramètres SRC_PATH et DEST_PATH. L’un des avantages de cette commande est que nous pouvons copier à la fois des fichiers et des répertoires vers et depuis des conteneurs en cours d’exécution ou arrêtés.

La commande docker cp ressemble à la commande Unix cp -a ; par conséquent, cela signifie qu’il copie également les répertoires de manière récursive. De plus, la commande suppose également que tous les chemins d’accès au conteneur sont relatifs au répertoire racine.

Nous allons commencer par créer d’abord notre conteneur cible ; par conséquent, nous avons également besoin d’une image. Nous utiliserons l’image officielle d’Ubuntu disponible dans le registre Docker.

$ docker pull ubuntu

Nous allons ensuite créer un conteneur docker en mode détaché et interactif. Cela permet à notre conteneur de fonctionner en arrière-plan.

$ docker run -it -d ubuntu
e10b4a7bbc59131d30492a87dd70b8ea74fa686ed5036ec918b6596fc83efe2b

En utilisant la commande exec, nous allons lancer une session SSH interactive en utilisant la commande docker exec et le drapeau -it. Cela nous permettra d’exécuter des commandes de manière interactive dans le conteneur.

Pour créer un simple fichier texte, nous allons naviguer vers le dossier /usr/share.

Nous allons commencer par entrer dans le conteneur en utilisant l’identifiant de conteneur respectif.

$ docker exec -it e10b4a7bbc59 /bin/bash
root@e10b4a7bbc59:/#

Nous naviguerons dans le dossier /usr/share/ dans le conteneur pour créer notre fichier texte.

$ docker exec -it e10b4a7bbc59 /bin/bash
root@e10b4a7bbc59:/# cd usr
root@e10b4a7bbc59:/usr# cd share
root@e10b4a7bbc59:/usr/share#

Nous allons créer un fichier nommé nouveau_fichier.txt à l’aide de la commande touch. Nous allons prochainement copier ce fichier de ce conteneur vers notre hébergeur.

Par conséquent, il est bon de noter le répertoire dans lequel le fichier est stocké car nous utiliserons cet emplacement lors de sa copie sur l’hôte.

root@e10b4a7bbc59:/usr/share# touch new_file.txt

Pour vérifier que nous avons créé le fichier, exécutez la commande ls pour répertorier tous les fichiers de ce répertoire, comme indiqué ci-dessous.

root@e10b4a7bbc59:/usr/share# ls
adduser      bash-completion  debianutils  dpkg  keyrings  man           pam          polkit-1
apport       bug              dict         gcc   libc-bin  menu          pam-configs  sensible-utils
base-files   common-licenses  doc          gdb   lintian   misc          perl5        tabset
base-passwd  debconf          doc-base     info  locale    new_file.txt  pixmaps      terminfo

Maintenant que nous avons créé avec succès un fichier dans notre conteneur, nous souhaitons copier ce fichier de ce conteneur vers notre hôte - quittez le conteneur dans le shell principal à l’aide de la commande exit.

Nous allons exécuter la commande docker cp dans le terminal et copier le new_file.txt dans un répertoire de la machine hôte. Cependant, nous devons d’abord prendre note de trois choses importantes :

  • L’identifiant du conteneur ;
  • L’emplacement du fichier cible dans le conteneur ;
  • Le répertoire cible de la machine hôte où nous allons copier le fichier.
$ docker cp e10b4a7bbc59:/usr/share/new_file.txt ./new_file.txt

Nous avons réussi à copier le new._file.txt sur la machine hôte en exécutant cette commande. Nous pouvons le vérifier en exécutant la commande ls dans ce dossier particulier.

isaac@DESKTOP-HV44HT6:~/isaac$ ls
adduser      bash-completion  debianutils  dpkg  keyrings  man     `new_file.txt`  pixmaps         terminfo
apport       bug              dict         gcc   libc-bin  menu    pam           polkit-1
base-files   common-licenses  doc          gdb   lintian   misc    pam-configs   sensible-utils
base-passwd  debconf          doc-base     info  locale    my-app  perl5         tabset

Utiliser les montages Docker pour copier des fichiers du conteneur Docker vers l’hôte

Nous pouvons également utiliser des montages Docker pour copier des fichiers du conteneur Docker vers l’hôte.

Les montages liés sont l’une des premières solutions qui nous permettent de conserver les données en montant nos conteneurs Docker dans des répertoires sur notre système hôte.

Les montages liés nous permettent de référencer un répertoire exact en se référant au chemin de fichier absolu du répertoire cible. Outre la copie de fichiers du conteneur vers l’hôte, nous pouvons également créer des services qui dépendent des répertoires du système hôte.

Pour créer un docker mount, nous pouvons utiliser le drapeau -v ou --mount lors de la création du conteneur docker. En plus de cet indicateur, nous spécifierons également le répertoire sur la machine hôte que nous voulons mapper à un répertoire sur le conteneur docker.

Cette méthode est souvent préférée car nous pouvons créer plusieurs montages dans un conteneur Docker. Nous pouvons également créer des répertoires pour transférer des fichiers de plusieurs conteneurs.

Pour monter notre répertoire dans le conteneur Docker, nous devons spécifier les champs suivants qui doivent toujours être dans le bon ordre, séparés par deux-points. Ceux-ci inclus:

  • Le chemin d’accès au répertoire sur la machine hôte que nous voulons monter ;
  • Le chemin d’accès au répertoire dans le conteneur où nous devons monter ce répertoire ;
  • D’autres options facultatives telles que ro spécifient le mode lecture seule.

Syntaxe:

docker run -t -i -v <host_dir>:<container_dir

Dans l’exemple ci-dessous, nous utilisons les images officielles Ruby pour créer un conteneur et monter un répertoire local dans un répertoire du conteneur. Une fois cela fait, nous pouvons facilement copier des fichiers du conteneur vers le répertoire local et vice versa.

$ docker run -it -v $HOME/Desktop/new_container:/new_container --name new_container ruby bash
root@7a00af9d4d96:/#

Nous pouvons facilement copier un fichier entre notre conteneur docker et le répertoire hôte. Notez également que les fichiers créés dans le répertoire hôte seront automatiquement disponibles dans le répertoire du conteneur docker monté sur l’hôte.

Utilisez COPY pour copier des fichiers du conteneur Docker vers l’hôte

Lors de la création d’une image docker à l’aide d’un fichier docker, nous pouvons également copier des fichiers entre l’hôte docker et le conteneur à l’aide de la commande COPY.

Syntaxe:

COPY <SRC> <DEST>

Dans le DockerFile ci-dessous, nous avons spécifié ./app.py comme répertoire source et /var/www/app.py comme répertoire cible.

#  base image
FROM python

# Set your working directory
WORKDIR /var/www/

# Copy the necessary filesls
COPY ./app.py /var/www/app.py
COPY ./requirements.txt /var/www/requirements.txt

# Install the necessary packages
RUN pip install -r /var/www/requirements.txt

# Run the app
ENTRYPOINT ["echo", "Hello, Developer"]

Ce DockerFile crée une image d’une simple application Flask qui imprime un message sur la console.

Auteur: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

Article connexe - Docker Container