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.

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

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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.