Dockerfile-Kopie behält Unterverzeichnisstruktur

256

Ich versuche, eine Reihe von Dateien und Ordnern in ein Docker-Image zu kopieren, das von meinem lokalen Host erstellt wurde.

Die Dateien sind wie folgt:

folder1
    file1
    file2
folder2
    file1
    file2

Ich versuche die Kopie so zu machen:

COPY files/* /files/

Alle Dateien werden jedoch in / files / abgelegt. Gibt es in Docker eine Möglichkeit, die Unterverzeichnisstruktur beizubehalten und die Dateien in ihre Verzeichnisse zu kopieren?

user1220022
quelle
1
Können Sie klären, welches Ergebnis Sie erzielt haben und welches Ergebnis Sie erwarten?
Thomasleveil

Antworten:

412

Entfernen Sie mit dieser Docker-Datei den Stern von COPY:

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

Struktur ist da:

$ 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
quelle
64
Aber was ist, wenn ich nur einige Dateien wie brauche COPY files/*1 /files/?
Pavel Agarkov
1
Überschreibt dies auch vorhandene Dateien in diesem Verzeichnis?
Chander
1
@chander, ja, vorhandene Dateien werden überschrieben
ISanych
4
Es ist wichtig zu beachten, dass die geheime Sauce hier darin besteht, dass EIN Quellverzeichnis und EIN Zielverzeichnis angegeben sind. Jede andere Kombination kopiert den Inhalt des Quellverzeichnisses (der Quellverzeichnisse) in das Zielverzeichnis.
Marcin
Ich konnte die Ausgabe von nicht RUN ls -la /files/*direkt von der Konsolenausgabe von sehen docker build. Also ging ich stattdessen ssh zum Container direkt, um lsdirekt auf dem Host zu tun , mitdocker exec -it <container name> /bin/bash
somenickname
31

Alternativ können Sie ein "." Fügen Sie anstelle von * die Ordner und Unterordner hinzu, da hierdurch alle Dateien im Arbeitsverzeichnis erfasst werden:

FROM ubuntu
COPY . /
RUN ls -la /
Sparkz0629
quelle
1
Enthält das versteckte Dateien und Verzeichnisse wie das Verzeichnis '.git'?
Bruno Negrão Zica
7
@ BrunoNegrãoZica, Sie können die .dockerignore-Datei verwenden, um anzugeben, welche Dateien / Ordner Sie beim Kopieren ignorieren möchten. Es ist spät, aber ich hoffe, es wäre hilfreich für jemand anderen
Hellaren
20

Gehen Sie folgendermaßen vor, um ein lokales Verzeichnis mit einem Verzeichnis in einem Image zusammenzuführen. Es werden keine Dateien gelöscht, die bereits im Bild vorhanden sind. Es werden nur lokal vorhandene Dateien hinzugefügt, wobei die Dateien im Bild überschrieben werden, wenn bereits eine gleichnamige Datei vorhanden ist.

COPY ./files/. /files/
Cameron Hudson
quelle