คัดลอกไดเรกทอรีไปยังไดเรกทอรีอื่นที่ Docker โดยใช้คำสั่ง ADD


382

ฉันได้อ่านhttp://docs.docker.com/engine/reference/builder/#addแต่ฉันพบปัญหา ฉันต้องการคัดลอกโลคัลไดเร็กทอรีgoไปยังนักเทียบท่า/user/local/

ฉันเหนื่อย:

ADD go /usr/local/

และ:

ADD /go/ /usr/local/ 

เพิ่มเติม:

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

แต่ผมเห็นข้อผิดพลาดต่อไปนี้/usr/local/go/src/make.bash: No such file or directoryแต่ท้องถิ่นไดเรกทอรีไม่ประกอบด้วยgomake.bash

คำตอบ:


704
ADD go /usr/local/

จะคัดลอกเนื้อหาของgoไดเรกทอรีท้องถิ่นของคุณใน/usr/local/ไดเรกทอรีของภาพนักเทียบท่าของคุณ

ในการคัดลอกgoไดเรกทอรีที่/usr/local/ใช้งานอยู่:

ADD go /usr/local/go

หรือ

COPY go /usr/local/go

43
ฉันกำลังพยายามใช้ ADD หลายเวอร์ชันต้นทางดังนั้นฉันจึงไม่สามารถระบุชื่อไดเรกทอรีเป้าหมายสำหรับปลายทางได้ มีวิธีทำสิ่งที่ OP ถามในรูปแบบ multi-src (เช่นโดยไม่ต้องสร้างADDเลเยอร์สำหรับแต่ละไดเรกทอรีแหล่งที่มา)?
Guss

9
ฉันแค่ต้องการเพิ่ม sidenote นี้โดยบอกว่า$HOMEหรือ~ตัวแปร shell อื่น ๆ จะไม่ทำงาน ฉันกำลังพูดแบบนี้เพราะฉันใช้จ่ายเป็นจำนวนมากพยายามที่จะคิดออกมากกว่าที่ฉันต้องการที่จะยอมรับแม้ว่ามันจะเห็นได้ชัดที่สุด
กรีด

34
คัดลอก go / usr / local / go ไม่ทำงานสำหรับฉัน ไม่ได้คัดลอก
Tyguy7

78
นี่เป็นเรื่องค่อนข้างสับสน ทำไมถึงไม่สามารถCOPYเพียงแค่ทำตัวเหมือนcp? แทนที่จะต้องมีตำรวจเสริมวิธีการทำงาน
Zelphir Kaltstahl

14
ไฟล์. docerignore สามารถซ่อนไดเรกทอรีและ COPY หรือ ADD จะไม่ทำงานสำหรับรายการที่แสดง
Vereb

49

แน่นอนADD go /usr/local/จะเพิ่มเนื้อหาของgoโฟลเดอร์และไม่ใช่ตัวโฟลเดอร์คุณสามารถใช้โซลูชัน Thomasleveil หรือหากไม่ได้ทำงานด้วยเหตุผลบางอย่างที่คุณสามารถเปลี่ยนWORKDIRเป็น/usr/local/แล้วเพิ่มไดเรกทอรีของคุณไปที่:

WORKDIR /usr/local/
COPY go go/

หรือ

WORKDIR /usr/local/go
COPY go ./

แต่ถ้าคุณต้องการเพิ่มหลาย ๆโฟลเดอร์มันจะน่ารำคาญที่จะเพิ่มมันอย่างนั้นทางออกเดียวสำหรับตอนนี้ที่ฉันเห็นจากปัญหาปัจจุบันของฉันคือการใช้COPY . .และไม่รวมไดเรกทอรีและไฟล์ที่ไม่ต้องการทั้งหมด.dockerignoreมาสมมติว่าฉันมีโฟลเดอร์และไฟล์ :

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

และฉันต้องการที่จะเพิ่มsrc assets package.json justforfun go:

ใน Dockerfile:

FROM galaxy:latest

WORKDIR /usr/local/
COPY . .

ในไฟล์ .ockerignore:

node_modules
headache.lock
tmp
dist

หรือเพื่อความสนุกสนานมากขึ้น (หรือคุณต้องการสร้างความสับสนให้ผู้คนมากขึ้นทำให้พวกเขาประสบเช่นกัน: P) สามารถ:

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

ด้วยวิธีนี้คุณจะไม่สนใจทุกสิ่ง แต่ไม่รวมสิ่งที่คุณต้องการคัดลอกหรือเพิ่มจาก "ละเว้นรายการ" เท่านั้น

มันเป็นคำตอบที่ล่าช้า แต่การเพิ่มวิธีการที่จะทำสิ่งที่เหมือนกันนั้นครอบคลุมมากขึ้น


12

คุณสามารถใช้ COPY คุณต้องระบุไดเรกทอรีอย่างชัดเจน มันจะไม่ถูกสร้างขึ้นด้วยตัวเอง

COPY go /usr/local/go

การอ้างอิง: การอ้างอิงDocker CP

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.