Skopiuj katalog do innego katalogu w Docker za pomocą polecenia ADD

382

Przeczytałem http://docs.docker.com/engine/reference/builder/#add jednak napotkałem problem. Chcę skopiować katalog lokalny godo okna dokowanego/user/local/

Próbowałem:

ADD go /usr/local/

i:

ADD /go/ /usr/local/ 

również:

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

Widzę jednak następujący komunikat o błędzie, /usr/local/go/src/make.bash: No such file or directoryale gokatalog lokalny zawiera make.bash.

pengwang
źródło

Odpowiedzi:

704
ADD go /usr/local/

skopiuje zawartośćgo katalogu lokalnego do /usr/local/katalogu obrazu dokera.

Aby skopiować gosam /usr/local/używany katalog :

ADD go /usr/local/go

lub

COPY go /usr/local/go
Thomasleveil
źródło
43
Próbuję użyć wersji ADD z wieloma źródłami, więc nie mogę podać nazwy katalogu docelowego dla miejsca docelowego. Czy istnieje sposób na zrobienie tego, o co OP poprosił w formacie wielu src (tj. Bez tworzenia ADDwarstwy dla każdego katalogu źródłowego)?
Guss
9
Chcę tylko dodać sidenote do tego stwierdzenia, że $HOMEalbo ~czy jakakolwiek inna zmienna powłoki nie będą działać. Mówię to, ponieważ spędziłem sporo czasu, próbując to rozgryźć, niż chciałbym przyznać, chociaż dla większości jest to rażąco oczywiste.
wrzask
34
COPY go / usr / local / go nie działa dla mnie. Nie kopiuje.
Tyguy7,
78
To naprawdę dość myląca sprawa. Dlaczego COPYpo prostu nie można się tak zachowywać cp? Zamiast tego musi być dodatkowa policja, jak to działa.
Zelphir Kaltstahl
14
Plik .dockerignore może ukryć katalog, a funkcja COPY lub ADD nie będzie działać w przypadku elementów na liście
Vereb
49

Rzeczywiście ADD go /usr/local/doda zawartość z gofolderu, a nie sam folder, można użyć Thomasleveil rozwiązanie lub jeśli to nie działa z jakiegoś powodu można zmienić WORKDIR, aby /usr/local/następnie dodać katalog do niego tak:

WORKDIR /usr/local/
COPY go go/

lub

WORKDIR /usr/local/go
COPY go ./

Ale jeśli chcesz dodać wiele folderów, dodawanie ich w ten sposób będzie denerwujące, jedynym rozwiązaniem na razie, jak widzę w moim bieżącym problemie, jest używanie COPY . .i wykluczanie wszystkich niechcianych katalogów i plików .dockerignore, powiedzmy, że mam foldery i pliki :

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

i chcę dodać, src assets package.json justforfun gowięc:

w Dockerfile:

FROM galaxy:latest

WORKDIR /usr/local/
COPY . .

w pliku .dockerignore:

node_modules
headache.lock
tmp
dist

Lub dla większej zabawy (lub chcesz pomylić więcej osób, które również cierpią: P) może być:

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

W ten sposób ignorujesz wszystko, ale wykluczasz to, co chcesz skopiować lub dodać tylko z „listy ignorowanych”.

Jest to odpowiedź późna, ale dodaje więcej sposobów, aby zrobić to samo, obejmując jeszcze więcej przypadków.

Al-Mothafar
źródło
12

Możesz użyć KOPIUJ. Musisz jawnie określić katalog. Nie zostanie stworzony sam

COPY go /usr/local/go

Odniesienie: Odniesienie do dokowania CP

Amstel D'Almeida
źródło