Dockerfile copy garder la structure du sous-répertoire

257

J'essaie de copier un certain nombre de fichiers et de dossiers dans une image Docker à partir de mon hôte local.

Les fichiers sont comme ceci:

folder1
    file1
    file2
folder2
    file1
    file2

J'essaie de faire la copie comme ceci:

COPY files/* /files/

Cependant, tous les fichiers sont placés dans / files / existe-t-il un moyen dans Docker de conserver la structure du sous-répertoire ainsi que de copier les fichiers dans leurs répertoires?

user1220022
la source
1
pourriez-vous préciser quel résultat vous avez obtenu et quel résultat vous attendez?
Thomasleveil

Réponses:

413

Supprimer l'étoile de COPY, avec ce Dockerfile:

FROM ubuntu
COPY files/ /files/
RUN ls -la /files/*

La structure est là:

$ docker build .
Sending build context to Docker daemon 5.632 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu
 ---> d0955f21bf24
Step 1 : COPY files/ /files/
 ---> 5cc4ae8708a6
Removing intermediate container c6f7f7ec8ccf
Step 2 : RUN ls -la /files/*
 ---> Running in 08ab9a1e042f
/files/folder1:
total 8
drwxr-xr-x 2 root root 4096 May 13 16:04 .
drwxr-xr-x 4 root root 4096 May 13 16:05 ..
-rw-r--r-- 1 root root    0 May 13 16:04 file1
-rw-r--r-- 1 root root    0 May 13 16:04 file2

/files/folder2:
total 8
drwxr-xr-x 2 root root 4096 May 13 16:04 .
drwxr-xr-x 4 root root 4096 May 13 16:05 ..
-rw-r--r-- 1 root root    0 May 13 16:04 file1
-rw-r--r-- 1 root root    0 May 13 16:04 file2
 ---> 03ff0a5d0e4b
Removing intermediate container 08ab9a1e042f
Successfully built 03ff0a5d0e4b
ISanych
la source
64
Mais que faire si j'ai besoin de quelques fichiers comme COPY files/*1 /files/?
Pavel Agarkov
1
Cela écrasera-t-il également les fichiers existants dans ce répertoire?
chander le
1
@chander, oui, les fichiers existants seront remplacés
ISanych
4
Il est important de noter que la sauce secrète ici est qu'il y a UN répertoire source et UN répertoire cible spécifié. Toute autre combinaison copie le contenu du ou des répertoires source (s) dans le répertoire cible.
Marcin
Je n'ai pas pu voir la sortie de RUN ls -la /files/*directement depuis la sortie de la console de docker build. Je suis donc allé directement au conteneur ssh pour le faire lsdirectement sur l'hôte, avecdocker exec -it <container name> /bin/bash
somenickname
32

Vous pouvez également utiliser un "." au lieu de *, car cela prendra tous les fichiers du répertoire de travail, incluez les dossiers et sous-dossiers:

FROM ubuntu
COPY . /
RUN ls -la /
Sparkz0629
la source
1
cela inclura-t-il des fichiers cachés et des répertoires comme le répertoire '.git'?
Bruno Negrão Zica
7
@ BrunoNegrãoZica, vous pouvez utiliser le fichier .dockerignore pour spécifier les fichiers / dossiers que vous souhaitez ignorer pendant l'opération de copie. Il est tard, mais j'espère que ce serait utile pour quelqu'un d'autre
Hellaren
22

Pour fusionner un répertoire local dans un répertoire d'une image, procédez comme suit. Il ne supprimera pas les fichiers déjà présents dans l'image. Il n'ajoutera que les fichiers présents localement, écrasant les fichiers dans l'image si un fichier du même nom existe déjà.

COPY ./files/. /files/
Cameron Hudson
la source