Sao chép thư mục vào thư mục khác tại Docker bằng lệnh ADD


382

Tôi đã đọc http://docs.docker.com/engine/reference/builder/#add tuy nhiên tôi đã gặp một vấn đề. Tôi muốn sao chép thư mục địa phương govào docker/user/local/

Tôi đã thử:

ADD go /usr/local/

và:

ADD /go/ /usr/local/ 

cũng thế:

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

Tuy nhiên, tôi thấy thông báo lỗi sau /usr/local/go/src/make.bash: No such file or directorynhưng gothư mục cục bộ có chứa make.bash.

Câu trả lời:


704
ADD go /usr/local/

sẽ sao chép nội dung của gothư mục cục bộ của bạn trong /usr/local/thư mục hình ảnh docker của bạn.

Để sao chép gochính thư mục đang /usr/local/sử dụng:

ADD go /usr/local/go

hoặc là

COPY go /usr/local/go

43
Tôi đang cố gắng sử dụng phiên bản nhiều nguồn của ADD và vì vậy tôi không thể chỉ định tên thư mục đích cho đích. Có cách nào để làm những gì OP yêu cầu ở định dạng multi-src (nghĩa là không tạo ADDlớp cho mỗi thư mục nguồn) không?
Guss

9
Tôi chỉ muốn thêm một sidenote này bằng cách nói rằng $HOMEhoặc ~hoặc bất kỳ biến vỏ khác sẽ không hoạt động. Tôi đang nói điều này bởi vì tôi đã bỏ ra số tiền lớn để cố gắng tìm ra điều này hơn là tôi muốn thừa nhận mặc dù điều đó rõ ràng rõ ràng với hầu hết.
hét

34
COPY go / usr / local / go không hoạt động với tôi. Không sao chép.
Tyguy7

78
Đây thực sự là một vấn đề khá khó hiểu. Tại sao không thể COPYcư xử đơn giản như thế cp? Thay vào đó cần phải có thêm một cảnh sát làm thế nào nó hoạt động.
Zelphir Kaltstahl

14
Tệp .dockerignore có thể ẩn một thư mục và COPY hoặc ADD sẽ không hoạt động đối với các mục được liệt kê
Vereb

49

Thật vậy, ADD go /usr/local/sẽ thêm nội dung của gothư mục chứ không phải chính thư mục, bạn có thể sử dụng giải pháp Thomasleveil hoặc nếu điều đó không hiệu quả vì một số lý do bạn có thể thay đổi WORKDIRđể /usr/local/sau đó thêm thư mục của mình vào đó như sau:

WORKDIR /usr/local/
COPY go go/

hoặc là

WORKDIR /usr/local/go
COPY go ./

Nhưng nếu bạn muốn thêm nhiều thư mục, sẽ rất khó chịu khi thêm chúng như vậy, giải pháp duy nhất hiện tại khi tôi thấy vấn đề hiện tại của mình là sử dụng COPY . .và loại trừ tất cả các thư mục và tệp không mong muốn .dockerignore, giả sử tôi có thư mục và tệp :

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

và tôi muốn thêm src assets package.json justforfun gonhư vậy:

trong Dockerfile:

FROM galaxy:latest

WORKDIR /usr/local/
COPY . .

trong tệp .dockerignore:

node_modules
headache.lock
tmp
dist

Hoặc để vui hơn (hoặc bạn muốn nhầm lẫn nhiều người hơn cũng khiến họ đau khổ: P) có thể là:

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

Theo cách này, bạn bỏ qua mọi thứ, nhưng loại trừ những gì bạn muốn được sao chép hoặc chỉ thêm vào từ "danh sách bỏ qua".

Đó là một câu trả lời muộn nhưng thêm nhiều cách để làm điều tương tự bao gồm nhiều trường hợp hơn.


12

Bạn có thể sử dụng SAO CHÉP. Bạn cần chỉ định rõ ràng thư mục. Nó sẽ không được tạo ra bởi chính nó

COPY go /usr/local/go

Tham khảo: Tham chiếu CP Docker

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.