wake-up-neo.net

Wie kopiere ich Ordner von Dockerfile in das Docker-Image?

Ich habe den folgenden Befehl in meinem Dockerfile ausprobiert: COPY * / und wurde vom Ergebnis mächtig überrascht. Scheint, dass der naive Docker-Code die Verzeichnisse aus dem Glob durchläuft und dann jede Datei im Zielverzeichnis speichert, während meine Verzeichnisstruktur respektvoll ignoriert wird. 

Zumindest verstehe ich dieses Ticket und es entspricht sicherlich dem Ergebnis, das ich erhalten habe. 

Ich denke, der einzige Grund, warum dieses Verhalten noch existieren kann, muss sein, dass es einen anderen Weg gibt, auf dem dies geschehen kann. Aber es ist nicht so leicht für einen Bär mit sehr wenig Hirn zu verstehen, wie, weiß jemand?

19
jonalv

Wie @Vonc sagte, gibt es keine Möglichkeit, einen Befehl wie jetzt hinzuzufügen. Die einzige Problemumgehung besteht darin, den Ordner zu erwähnen, ihn zu erstellen und Inhalte hinzuzufügen.

# add contents to folder
ADD src $HOME/src

Erstellen Sie in Ihrem Verzeichnis einen Ordner mit dem Namen src und fügen Sie den Inhalt Ihres Ordners src hinzu.

8
Balasubramani M

Wie in Ihrem Ticket erwähnt :

Sie haben COPY files/* /test/, der zu COPY files/dir files/file1 files/file2 files/file /test/ erweitert wird.
Wenn Sie dies in einzelne COPY-Befehle aufteilen (z. B. COPY files/dir /test/), werden Sie feststellen, dass COPY (zum besseren oder schlechten) den Inhalt jedes Argons dir in das Zielverzeichnis kopiert. Nicht das arg dir selbst, sondern der Inhalt. 

Ich bin nicht begeistert von der Tatsache, dass COPY das Dir-Level-Verzeichnis nicht bewahrt, aber es ist schon eine Weile so.

um eine Abwärtskompatibilität zu gewährleisten, ist es daher nicht möglich, COPY/ADD eine Verzeichnisstruktur zu ändern.

Die einzige Problemumgehung wäre eine Reihe von RUN mkdir -p /x/y/z zum Erstellen der Zielverzeichnisstruktur, gefolgt von einer Reihe von docker ADD (eine für jeden zu befüllenden Ordner).
(ADD, nicht COPY, wie in den Kommentaren)

7
VonC

Verwenden Sie ADD ( docs )

Der Befehl ADD kann als <src>-Parameter Folgendes akzeptieren: 

  1. Ein Ordner innerhalb des Erstellungsordners (derselbe Ordner wie Ihre Docker-Datei). Sie fügen dann eine Zeile in Ihr Dockerfile hinzu: ADD folder /path/inside/your/container

oder

  1. Ein Einzeldatei-Archiv an beliebiger Stelle in Ihrem Host-Dateisystem. Um ein Archiv zu erstellen, verwenden Sie den Befehl: tar -cvzf newArchive.tar.gz /path/to/your/folder Dann fügen Sie Ihrer Docker-Datei eine Zeile wie folgt hinzu: ADD /path/to/archive/newArchive.tar.gz /path/inside/your/container

Anmerkungen:

  • ADD extrahiert automatisch Ihr Archiv. 
  • vorhandensein/Fehlen nachstehender Schrägstriche ist wichtig, siehe die verknüpften Dokumente
5
ryanrain

Ersetzen Sie das * durch ein /

Also statt 

COPY * <destination>

benutzen

COPY / <destination>

4
rayscott

verwenden Sie ADD anstelle von COPY. Angenommen, Sie möchten alles im Verzeichnis src vom Host in das Verzeichnis dst aus dem Container kopieren:

ADD src dst

Hinweis: b wird automatisch in einem Container erstellt.

3
Hin Fan Chan

COPY . <destination>

Welches wäre in Ihrem Fall:

COPY . /

1
Klaus

Ich kann den Fall des ursprünglichen Posters nicht ganz verstehen, aber ich kann nachweisen, dass es möglich ist, die Verzeichnisstruktur mithilfe von COPY in Dockerfile zu kopieren.

Angenommen, Sie haben diese Ordnerstruktur:

folder1
  file1.html
  file2.html
folder2
  file3.html
  file4.html
  subfolder
    file5.html
    file6.html

Um es in das Zielbild zu kopieren, können Sie einen solchen Dockerfile-Inhalt verwenden:

FROM nginx

COPY ./folder1/ /usr/share/nginx/html/folder1/
COPY ./folder2/ /usr/share/nginx/html/folder2/

RUN ls -laR /usr/share/nginx/html/*

Die Ausgabe von docker build . lautet wie folgt:

$ docker build --no-cache .
Sending build context to Docker daemon  9.728kB
Step 1/4 : FROM nginx
 ---> 7042885a156a
Step 2/4 : COPY ./folder1/ /usr/share/nginx/html/folder1/
 ---> 6388fd58798b
Step 3/4 : COPY ./folder2/ /usr/share/nginx/html/folder2/
 ---> fb6c6eacf41e
Step 4/4 : RUN ls -laR /usr/share/nginx/html/*
 ---> Running in face3cbc0031
-rw-r--r-- 1 root root  494 Dec 25 09:56 /usr/share/nginx/html/50x.html
-rw-r--r-- 1 root root  612 Dec 25 09:56 /usr/share/nginx/html/index.html

/usr/share/nginx/html/folder1:
total 16
drwxr-xr-x 2 root root 4096 Jan 16 10:43 .
drwxr-xr-x 1 root root 4096 Jan 16 10:43 ..
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file1.html
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file2.html

/usr/share/nginx/html/folder2:
total 20
drwxr-xr-x 3 root root 4096 Jan 16 10:43 .
drwxr-xr-x 1 root root 4096 Jan 16 10:43 ..
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file3.html
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file4.html
drwxr-xr-x 2 root root 4096 Jan 16 10:33 subfolder

/usr/share/nginx/html/folder2/subfolder:
total 16
drwxr-xr-x 2 root root 4096 Jan 16 10:33 .
drwxr-xr-x 3 root root 4096 Jan 16 10:43 ..
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file5.html
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file6.html
Removing intermediate container face3cbc0031
 ---> 0e0062afab76
Successfully built 0e0062afab76
0
Mike Eshva