Kopieren Sie das Verzeichnis mit dem Befehl ADD in ein anderes Verzeichnis bei Docker


382

Ich habe http://docs.docker.com/engine/reference/builder/#add gelesen, bin jedoch auf ein Problem gestoßen. Ich möchte das lokale Verzeichnis goin Docker kopieren/user/local/

Ich habe es versucht:

ADD go /usr/local/

und:

ADD /go/ /usr/local/ 

ebenfalls:

RUN chmod 0755 /usr/local/go/src/make.bash

Ich sehe jedoch die folgende Fehlermeldung, /usr/local/go/src/make.bash: No such file or directoryaber das lokale goVerzeichnis enthält make.bash.

Antworten:


704
ADD go /usr/local/

kopiert den Inhalt Ihres lokalen goVerzeichnisses in das /usr/local/Verzeichnis Ihres Docker-Images.

So kopieren Sie das verwendete goVerzeichnis selbst /usr/local/:

ADD go /usr/local/go

oder

COPY go /usr/local/go

43
Ich versuche, die Mehrfachquellenversion von ADD zu verwenden, daher kann ich den Zielverzeichnisnamen für das Ziel nicht angeben. Gibt es eine Möglichkeit, das zu tun, was das OP in einem Multi-SRC-Format verlangt hat (dh ohne ADDfür jedes Quellverzeichnis eine Ebene zu erstellen )?
Guss

9
Ich möchte nur eine Bemerkung am Rande dazu hinzufügen , indem Sie sagen , dass $HOMEoder ~oder ein beliebiges anderes Shell - Variable wird nicht funktionieren. Ich sage das, weil ich viel ausgegeben habe, um das herauszufinden, als ich zugeben möchte, obwohl es für die meisten offensichtlich ist.
Schrei

34
COPY go / usr / local / go funktioniert bei mir nicht. Kopiert nicht.
Tyguy7

78
Das ist wirklich eine ziemlich verwirrende Angelegenheit. Warum kann man sich nicht COPYeinfach so verhalten cp? Stattdessen muss es eine zusätzliche Polizei geben, wie es funktioniert.
Zelphir Kaltstahl

14
.dockerignore-Datei kann ein Verzeichnis ausblenden und COPY oder ADD funktioniert nicht für aufgelistete Elemente
Vereb

49

Tatsächlich ADD go /usr/local/fügt Inhalt des goOrdners und nicht der Ordner selbst, können Sie Thomasleveil Lösung verwenden oder wenn das aus irgendeinem Grunde nicht funktioniert können Sie ändern , WORKDIRum /usr/local/dann Ihr Verzeichnis wie um es hinzuzufügen:

WORKDIR /usr/local/
COPY go go/

oder

WORKDIR /usr/local/go
COPY go ./

Wenn Sie jedoch mehrere Ordner hinzufügen möchten , ist es ärgerlich, sie so hinzuzufügen. Die einzige Lösung, die ich derzeit in meinem aktuellen Problem sehe, besteht darin COPY . ., alle unerwünschten Verzeichnisse und Dateien zu verwenden und auszuschließen. Nehmen .dockerignorewir an, ich habe Ordner und Dateien ::

- src 
- tmp 
- dist 
- assets 
- go 
- justforfun 
- node_modules 
- scripts 
- .dockerignore 
- Dockerfile 
- headache.lock 
- package.json 

und ich möchte so hinzufügen src assets package.json justforfun go:

in Dockerfile:

FROM galaxy:latest

WORKDIR /usr/local/
COPY . .

in der .dockerignore-Datei:

node_modules
headache.lock
tmp
dist

Oder für mehr Spaß (oder wenn Sie mehr Menschen verwirren möchten, lassen Sie sie auch leiden: P) kann sein:

*
!src 
!assets 
!go 
!justforfun 
!scripts 
!package.json 

Auf diese Weise ignorieren Sie alles, schließen jedoch aus, was Sie kopieren oder hinzufügen möchten, nur aus der "Ignorierliste".

Es ist eine späte Antwort, aber es werden noch mehr Möglichkeiten hinzugefügt, um dasselbe zu tun und noch mehr Fälle abzudecken.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.