601 Stimmen

Kopiere ein Verzeichnis in ein anderes Verzeichnis mit dem Befehl ADD

Ich habe http://docs.docker.com/engine/reference/builder/#add gelesen, aber ich bin auf ein Problem gestoßen. Ich möchte das lokale Verzeichnis go nach /usr/local/ in Docker kopieren.

Ich habe versucht:

ADD go /usr/local/

und:

ADD /go/ /usr/local/ 

auch:

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

Dennoch erhalte ich die folgende Fehlermeldung:

/usr/local/go/src/make.bash: Datei oder Verzeichnis nicht gefunden

aber das lokale Verzeichnis go enthält tatsächlich make.bash.

1179voto

Thomasleveil Punkte 91312
ADD go /usr/local/

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

Um das Verzeichnis go selbst in /usr/local/ zu kopieren, verwenden Sie:

ADD go /usr/local/go

oder

COPY go /usr/local/go

134voto

Al-Mothafar Punkte 7176

Tatsächlich wird ADD go /usr/local/ den Inhalt des go Ordners hinzufügen und nicht den Ordner selbst, du kannst Thomasleveils Lösung benutzen oder wenn das aus irgendeinem Grund nicht funktioniert, kannst du WORKDIR zu /usr/local/ ändern und deinen Ordner so hinzufügen:

WORKDIR /usr/local/
COPY go go/

oder

WORKDIR /usr/local/go
COPY go ./

ABER wenn du mehrere Ordner hinzufügen möchtest, wird es mühsam sein, sie so hinzuzufügen, die einzige Lösung für mein aktuelles Problem ist im Moment COPY . . zu verwenden und alle unerwünschten Ordner und Dateien in .dockerignore auszuschließen, sagen wir, ich habe Ordner und Dateien:

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

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

im Dockerfile:

FROM galaxy:latest

WORKDIR /usr/local/
COPY . .

in der .dockerignore Datei:

node_modules
headache.lock
tmp
dist

Auf diese Weise ignorierst du node_modules headache.lock tmp dist, so dass sie nicht hinzugefügt werden!

Zweiter Ansatz: Oder für mehr Spaß (oder du möchtest mehr Leute verwirren und sie auch leiden lassen :P) kann sein:

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

Auf diese Weise ignorierst du alles, außer was du aus der "Ignorier-Liste" kopieren oder hinzufügen möchtest.

Es ist eine späte Antwort, aber weitere Möglichkeiten, das Gleiche zu tun, abzudecken, deckt noch mehr Fälle ab.

34voto

Amstel D'Almeida Punkte 660

Sie können COPY verwenden. Sie müssen das Verzeichnis explizit angeben. Es wird nicht automatisch erstellt

COPY go /usr/local/go

Referenz: Docker CP Referenz

18voto

Davide Calarco Punkte 502

Wie es in den offiziellen Dokumenten heißt:

Das Verzeichnis selbst wird nicht kopiert, sondern nur dessen Inhalt.

Der Trick besteht darin, im Pfad auch den Ordnernamen zu konkatenieren, so wie hier:

COPY src ./src

Auch wenn ./src im Container noch nicht existiert, erstellt der Befehl COPY intern das Verzeichnis und kopiert den Inhalt von src in den neuen Ordner (welcher ./src ist).

-3voto

mattylantz Punkte 265

Jahre später, aber ich hatte dieses Problem, weil mein Ordner ein Punkt enthielt. Als ich ihn entfernte, war der Fehler verschwunden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X