Salinan Dockerfile menyimpan struktur subdirektori

256

Saya mencoba untuk menyalin sejumlah file dan folder ke build docker image dari localhost saya.

File-nya seperti ini:

folder1
    file1
    file2
folder2
    file1
    file2

Saya mencoba membuat salinan seperti ini:

COPY files/* /files/

Namun, semua file ditempatkan di / file / apakah ada cara di Docker untuk menjaga struktur subdirektori serta menyalin file ke direktori mereka?

pengguna1220022
sumber
1
dapatkah Anda mengklarifikasi hasil apa yang Anda dapatkan dan hasil apa yang Anda harapkan?
Thomasleveil

Jawaban:

413

Hapus bintang dari COPY, dengan Dockerfile ini:

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

Struktur ada di sana:

$ 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
ISanych
sumber
64
Tetapi bagaimana jika saya hanya membutuhkan beberapa file saja COPY files/*1 /files/?
Pavel Agarkov
1
Apakah ini juga akan menimpa file yang ada di direktori itu?
chander
1
@chander, ya, file yang ada akan ditimpa ulang
ISanych
4
Penting untuk dicatat bahwa saus rahasia di sini adalah bahwa ada SATU direktori sumber, dan SATU direktori target ditentukan. Kombinasi lainnya menyalin konten direktori sumber ke direktori target.
Marcin
Saya tidak dapat melihat output RUN ls -la /files/*langsung dari output konsol docker build. Jadi saya malah pergi ssh ke wadah langsung untuk melakukan lslangsung pada tuan rumah, dengandocker exec -it <container name> /bin/bash
somenickname
31

Atau Anda dapat menggunakan "." alih-alih *, karena ini akan mengambil semua file di direktori kerja, sertakan folder dan subfolder:

FROM ubuntu
COPY . /
RUN ls -la /
Sparkz0629
sumber
1
apakah itu akan menyertakan file dan direktori tersembunyi seperti direktori '.git'?
Bruno Negrão Zica
7
@ BrunoNegrãoZica, Anda dapat menggunakan file .dockerignore untuk menentukan file / folder apa yang ingin Anda abaikan selama operasi penyalinan. Sudah terlambat, tapi harap ini akan membantu orang lain
Hellaren
21

Untuk menggabungkan direktori lokal ke direktori di dalam gambar, lakukan ini. Itu tidak akan menghapus file yang sudah ada dalam gambar. Itu hanya akan menambahkan file yang ada secara lokal, menimpa file dalam gambar jika file dengan nama yang sama sudah ada.

COPY ./files/. /files/
Cameron Hudson
sumber