HOWTO · Docker
Copier les fichiers de l'hôte vers le conteneur Docker
Ce didacticiel montre comment copier des fichiers d'un hôte vers un conteneur Docker.
Pour transférer une fois un fichier dans un conteneur existant, utilisez docker cp avec un chemin local et un chemin dans le conteneur :
docker cp ./local-file CONTAINER:/existing-directory/
Remplacez CONTENEUR par le nom ou l’ID du conteneur. docker cp fonctionne avec un conteneur démarré ou arrêté. Les chemins locaux relatifs sont résolus depuis le répertoire courant ; les chemins du conteneur sont enracinés dans /, même si la barre initiale est facultative. La référence docker cp décrit toute la syntaxe.
Copier un fichier dans un conteneur existant
La commande suivante copie hello.txt dans /opt/ du conteneur demo-app. Ce répertoire doit déjà exister :
docker cp ./hello.txt demo-app:/opt/
Si /opt/ existe, le fichier obtenu est /opt/hello.txt. La barre finale indique explicitement un répertoire de destination. Si la destination est un fichier existant, docker cp en remplace le contenu ; vérifiez-la d’abord lorsque cet écrasement serait risqué.
Pour contrôler la copie dans un conteneur démarré, lancez directement une commande :
docker exec demo-app ls -l /opt/hello.txt
La liste doit contenir le fichier. docker exec exige un conteneur démarré, contrairement à docker cp, qui accepte également un conteneur arrêté.
Copier un répertoire ou seulement son contenu
docker cp copie les répertoires récursivement. L’écriture de la source détermine si Docker place le répertoire lui-même ou uniquement son contenu dans la destination :
# Creates /opt/host-files/ in the container.
docker cp ./host-files demo-app:/opt/
# Copies the contents of host-files into the existing /opt/incoming/ directory.
docker cp ./host-files/. demo-app:/opt/incoming/
Dans le second cas, /opt/incoming/ doit exister. Le suffixe /. évite le niveau supplémentaire host-files. Docker ne crée pas les répertoires parents absents : une destination terminée par / doit donc être un répertoire existant. Consultez les règles de destination de docker cp pour tous les cas fichier/répertoire.
Choisir entre docker cp, COPY et un montage bind
| Besoin | Utiliser | Raison |
|---|---|---|
| Ajouter maintenant un fichier à un conteneur existant | docker cp |
Effectue une copie ponctuelle dans le système de fichiers de ce conteneur. |
| Ajouter des fichiers à chaque construction d’image | COPY dans le Dockerfile |
Ajoute les fichiers du contexte de construction à l’image. |
| Partager un répertoire de l’hôte avec le conteneur pendant le développement | Montage bind | Partage le chemin à l’exécution au lieu de créer une copie. |
Pour intégrer un fichier d’application à une image, écrivez dans le Dockerfile :
COPY ./config.yaml /app/config.yaml
COPY est une instruction de construction, pas un moyen de modifier un conteneur existant. Ses sources sont évaluées depuis le contexte de construction ; un chemin extérieur à ce contexte n’est normalement pas accessible. Consultez la référence Dockerfile COPY.
Pour partager des modifications répétées, créez le conteneur avec un montage bind :
docker run --mount type=bind,source=/absolute/host/path,target=/app/input,readonly IMAGE
Un montage bind partage un stockage ; il ne copie pas les fichiers. Sans readonly, un processus du conteneur peut modifier ou supprimer les fichiers de l’hôte auxquels il accède. Montez un répertoire hôte pour partager les fichiers en direct lorsque c’est le besoin réel ; Docker décrit aussi les compromis de partage et d’autorisations des montages bind.
N’utilisez pas non plus docker cp comme configuration d’image : la copie reste dans le système de fichiers inscriptible de ce conteneur. Elle survit à son redémarrage, mais pas au remplacement du conteneur par un nouveau conteneur créé depuis l’image.
Éviter les erreurs courantes avec docker cp
Vérifiez les chemins avant la copie. La source locale doit exister. Pour un fichier copié vers une destination inexistante sans / final, Docker peut créer le fichier à ce chemin exact, mais pas ses répertoires parents. Pour un répertoire source, Docker peut créer le répertoire de destination final si son parent existe ; il ne peut pas copier un répertoire sur un fichier.
Par défaut, les fichiers copiés dans le conteneur appartiennent à l’utilisateur et au groupe de destination, généralement root:root. N’ajoutez -a que si conserver l’UID et le GID de la source convient aux utilisateurs du conteneur. Un lien symbolique local est copié en tant que lien par défaut ; utilisez -L pour copier sa cible. Les permissions de destination peuvent aussi rendre la copie inutilisable.
Enfin, docker cp ne peut pas copier certains chemins système du conteneur, notamment des ressources sous /proc, /sys et /dev, des systèmes de fichiers temporaires et des montages créés par l’utilisateur. Ces cas exigent une méthode propre au conteneur ; consultez les limitations documentées.