Salin direktori ke direktori lain di Docker menggunakan perintah ADD

382

Saya telah membaca http://docs.docker.com/engine/reference/builder/#add namun saya menemui masalah. Saya ingin menyalin direktori lokal goke buruh pelabuhan/user/local/

Saya mencoba:

ADD go /usr/local/

dan:

ADD /go/ /usr/local/ 

juga:

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

Namun, saya melihat pesan kesalahan berikut /usr/local/go/src/make.bash: No such file or directorytetapi godirektori lokal memang mengandung make.bash.

pengwang
sumber

Jawaban:

704
ADD go /usr/local/

akan menyalin isigo direktori lokal Anda di /usr/local/direktori gambar buruh pelabuhan Anda.

Untuk menyalin godirektori itu sendiri /usr/local/digunakan:

ADD go /usr/local/go

atau

COPY go /usr/local/go
Thomasleveil
sumber
43
Saya mencoba menggunakan beberapa versi sumber ADD, jadi saya tidak dapat menentukan nama direktori target untuk tujuan. Apakah ada cara untuk melakukan apa yang diminta OP dalam format multi-src (yaitu tanpa membuat ADDlayer untuk setiap direktori sumber)?
Guss
9
Saya hanya ingin menambahkan sidenote ke ini dengan mengatakan bahwa $HOMEatau ~variabel shell lainnya tidak akan berfungsi. Saya mengatakan ini karena saya menghabiskan banyak uang untuk mencari tahu hal ini daripada yang ingin saya akui meskipun itu sangat jelas bagi kebanyakan orang.
pekik
34
COPY go / usr / local / go tidak bekerja untuk saya. Tidak menyalin
Tyguy7
78
Ini benar-benar masalah yang membingungkan. Mengapa tidak bisa COPYbersikap seperti itu cp? Sebaliknya perlu ada polisi tambahan cara kerjanya.
Zelphir Kaltstahl
14
File .dockerignore dapat menyembunyikan direktori dan COPY atau ADD tidak akan berfungsi untuk item yang terdaftar
Vereb
49

Memang ADD go /usr/local/akan menambahkan konten dari gofolder dan bukan folder itu sendiri, Anda dapat menggunakan solusi Thomasleveil atau jika yang tidak bekerja untuk beberapa alasan Anda dapat mengubah WORKDIRke /usr/local/kemudian menambahkan direktori Anda untuk itu seperti:

WORKDIR /usr/local/
COPY go go/

atau

WORKDIR /usr/local/go
COPY go ./

Tetapi jika Anda ingin menambahkan beberapa folder, akan sangat menjengkelkan untuk menambahkannya seperti itu, satu-satunya solusi untuk saat ini seperti yang saya lihat dari masalah saya saat ini adalah menggunakan COPY . .dan mengecualikan semua direktori dan file yang tidak diinginkan .dockerignore, katakanlah saya punya folder dan file :

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

dan saya ingin menambahkan src assets package.json justforfun go:

di Dockerfile:

FROM galaxy:latest

WORKDIR /usr/local/
COPY . .

dalam file .dockerignore:

node_modules
headache.lock
tmp
dist

Atau untuk lebih bersenang-senang (atau Anda ingin membingungkan lebih banyak orang membuat mereka menderita juga: P) dapat:

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

Dengan cara ini Anda mengabaikan segalanya, tetapi mengecualikan apa yang ingin Anda salin atau tambahkan hanya dari "daftar abaikan".

Ini adalah jawaban yang terlambat tetapi menambahkan lebih banyak cara untuk melakukan hal yang sama bahkan mencakup lebih banyak kasus.

Al-Mothafar
sumber
12

Anda bisa menggunakan COPY. Anda perlu menentukan direktori secara eksplisit. Itu tidak akan dibuat dengan sendirinya

COPY go /usr/local/go

Referensi: Referensi Docker CP

Amstel D'Almeida
sumber