Bản sao Dockerfile giữ cấu trúc thư mục con


256

Tôi đang cố gắng sao chép một số tệp và thư mục vào bản dựng hình ảnh docker từ localhost của tôi.

Các tập tin là như thế này:

folder1
    file1
    file2
folder2
    file1
    file2

Tôi đang cố gắng tạo bản sao như thế này:

COPY files/* /files/

Tuy nhiên, tất cả các tệp được đặt trong / files / có cách nào trong Docker để giữ cấu trúc thư mục con cũng như sao chép các tệp vào thư mục của chúng không?


1
bạn có thể làm rõ kết quả bạn nhận được và kết quả bạn mong đợi?
Thomasleveil

Câu trả lời:


412

Xóa sao khỏi COPY, với Dockerfile này:

FROM ubuntu
COPY files/ /files/
RUN ls -la /files/*

Cấu trúc là có:

$ docker build .
Sending build context to Docker daemon 5.632 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu
 ---> d0955f21bf24
Step 1 : COPY files/ /files/
 ---> 5cc4ae8708a6
Removing intermediate container c6f7f7ec8ccf
Step 2 : RUN ls -la /files/*
 ---> Running in 08ab9a1e042f
/files/folder1:
total 8
drwxr-xr-x 2 root root 4096 May 13 16:04 .
drwxr-xr-x 4 root root 4096 May 13 16:05 ..
-rw-r--r-- 1 root root    0 May 13 16:04 file1
-rw-r--r-- 1 root root    0 May 13 16:04 file2

/files/folder2:
total 8
drwxr-xr-x 2 root root 4096 May 13 16:04 .
drwxr-xr-x 4 root root 4096 May 13 16:05 ..
-rw-r--r-- 1 root root    0 May 13 16:04 file1
-rw-r--r-- 1 root root    0 May 13 16:04 file2
 ---> 03ff0a5d0e4b
Removing intermediate container 08ab9a1e042f
Successfully built 03ff0a5d0e4b

64
Nhưng nếu tôi chỉ cần một số tập tin như thế COPY files/*1 /files/nào?
Pavel Agarkov

1
Điều này cũng sẽ ghi đè lên các tập tin hiện có trong thư mục đó?
tán gẫu

1
@chander, vâng, các tệp hiện có sẽ bị ghi đè
ISanych

4
Điều quan trọng cần lưu ý rằng nước sốt bí mật ở đây là có MỘT thư mục nguồn và MỘT thư mục đích được chỉ định. Bất kỳ sự kết hợp nào khác sao chép nội dung của thư mục nguồn vào thư mục đích.
Marcin

Tôi không thể thấy đầu ra RUN ls -la /files/*trực tiếp từ đầu ra của bàn điều khiển docker build. Vì vậy, thay vào đó tôi đã đi ssh đến container trực tiếp để làm lstrực tiếp trên máy chủ, vớidocker exec -it <container name> /bin/bash
somenickname 16/07/19

31

Ngoài ra, bạn có thể sử dụng một "." thay vì *, vì điều này sẽ lấy tất cả các tệp trong thư mục làm việc, bao gồm các thư mục và thư mục con:

FROM ubuntu
COPY . /
RUN ls -la /

1
sẽ bao gồm các tệp và thư mục ẩn như thư mục '.git'?
Bruno Negrão Zica

7
@ BrunoNegrãoZica, bạn có thể sử dụng tệp .dockerignore để chỉ định tệp / thư mục nào bạn muốn bỏ qua trong quá trình sao chép. Đã muộn, nhưng hy vọng nó sẽ hữu ích cho người khác
Hellaren

21

Để hợp nhất một thư mục cục bộ vào một thư mục trong một hình ảnh, hãy làm điều này. Nó sẽ không xóa các tập tin đã có trong hình ảnh. Nó sẽ chỉ thêm các tệp có mặt cục bộ, ghi đè các tệp trong ảnh nếu một tệp cùng tên đã tồn tại.

COPY ./files/. /files/
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.