วิธีคัดลอกหลายไฟล์ในหนึ่งเลเยอร์โดยใช้ Dockerfile


246

ต่อไปนี้Dockerfileมีสี่COPYชั้น:

COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./

วิธีคัดลอกไฟล์เหล่านี้โดยใช้หนึ่งเลเยอร์แทนได้อย่างไร พยายามต่อไปนี้:

COPY [
    "__BUILD_NUMBER ./",
    "README.md ./",
    "gulpfile ./",
    "another_file ./",
]

คำตอบ:


427
COPY README.md package.json gulpfile.js __BUILD_NUMBER ./

หรือ

COPY ["__BUILD_NUMBER", "README.md", "gulpfile", "another_file", "./"]

คุณยังสามารถใช้อักขระตัวแทนในข้อมูลจำเพาะของ sourcefile ดูเอกสารสำหรับรายละเอียดเล็ก ๆ น้อย ๆ

ไดเรกทอรีพิเศษ! ถ้าคุณเขียน

COPY dir1 dir2 ./

ที่ใช้งานได้จริงเช่น

COPY dir1/* dir2/* ./

หากคุณต้องการที่จะคัดลอกไดเรกทอรีหลาย (ไม่ใช่เนื้อหาของพวกเขา) ภายใต้ไดเรกทอรีปลายทางในคำสั่งเดียวคุณจะต้องตั้งค่าบริบทการสร้างเพื่อให้ไดเรกทอรีที่มาของคุณอยู่ภายใต้การเป็นผู้ปกครองร่วมกันแล้วCOPYว่าผู้ปกครอง


53
โปรดทราบว่าหากแหล่งที่มาเป็นไดเรกทอรีสิ่งนี้จะคัดลอกเนื้อหาไดเรกทอรีไม่ใช่ไดเรกทอรีเอง
Claudiu

7
โปรดทราบว่าไดเรกทอรีปลายทางเหมือนกัน หากคุณมีไฟล์จำนวนมากที่มีปลายทางแตกต่างกันคุณอาจต้องการสร้างระบบไฟล์ซ้อนทับ (เช่น chroot) จากนั้นเปลี่ยนเป็นtarไฟล์เก็บถาวรและเพิ่มด้วย ADD
tu-Reinstate Monica-dor duh

4
@Claudiu วิธีการคัดลอกโฟลเดอร์เอง?
k0pernikus

5
@ k0pernikus คุณสามารถพูดคัดลอก myDir1 ./MyDir1/
Manuel Manhart

@ manuel-manhart มีใครบ้างที่รู้ว่าเราสามารถกำหนดพารามิเตอร์รายการไฟล์โดยใช้พารามิเตอร์ Build หรือไม่ github.com/moby/moby/issues/38532 ?
Marcello de Sales

52
COPY <all> <the> <things> <last-arg-is-destination>

แต่นี่เป็นข้อความที่ตัดตอนมาสำคัญจากเอกสาร:

หากคุณมีหลายขั้นตอน Dockerfile ที่ใช้ไฟล์ที่แตกต่างจากบริบทของคุณให้คัดลอกทีละไฟล์แทนที่จะทำพร้อมกัน สิ่งนี้ทำให้มั่นใจได้ว่าแคชบิลด์ของแต่ละขั้นตอนนั้นไม่ถูกต้องเท่านั้น

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy


คุณรู้หรือไม่ว่าเราสามารถแปรพารามิเตอร์ "ทุกสิ่ง" ??? ใช้พารามิเตอร์บิลด์หรือไม่? github.com/moby/moby/issues/38532 ???
Marcello de Sales

@MarcellodeSales ไม่แน่ใจว่าทำไมคุณต้องใช้ ทำไมคุณไม่สร้างอิมเมจพื้นฐานโดยไม่มีไฟล์เหล่านี้และจากนั้นอิมเมจย่อยจะมีคำสั่งการคัดลอกอยู่ในนั้น - ถ้าพวกเขาต้องการกำหนดพา ธ อย่างไรก็ตามมันไม่ได้สร้างความแตกต่างอะไรมากมาย หรือคุณอาจปล่อยให้มันออกไปรูปภาพและติดตั้งลงในภาชนะ - คุณมีไฟล์. env เพื่อกำหนดค่านี้
Manuel Manhart

นอกจากนี้คุณยังสามารถคัดลอกพา ธ ที่มีอยู่ได้ทุกเมื่อเนื่องจากระบบไฟล์เป็นเลเยอร์มันจะทับซ้อน / เงาของเนื้อหาที่มีอยู่ก่อน
Manuel Manhart

@ ManuelManhart ฉันกำลังสร้างอิมเมจพารามิเตอร์แบบไดนามิกโดยใช้ ONBUILD COPY ... ในฐานะส่วนหนึ่งของแพลตฟอร์มฉันกำลังซ่อนความซับซ้อนของสิ่งที่ต้องทำในรูปดังนั้นนั่นคือเหตุผลที่ฉันต้องการค่าที่จะให้ เป็นพารามิเตอร์
Marcello de Sales

@MarcellodeSales ฉันไม่คิดว่าตอนนี้ได้รับการสนับสนุนแล้ว / ยัง แต่คุณสามารถใช้การสร้างอาร์กิวเมนต์เพื่อให้มีการห่อหุ้มดูstackoverflow.com/questions/43654656/…
Manuel Manhart

7

ง่าย

COPY README.md  package.json gulpfile.js __BUILD_NUMBER ./

จากเอกสาร

หากระบุหลายทรัพยากรไม่ว่าจะโดยตรงหรือเนื่องมาจากการใช้ไวด์การ์ดนั้นจะต้องเป็นไดเรกทอรีและจะต้องลงท้ายด้วยเครื่องหมายสแลช /


6

อาจมีค่าควรกล่าวถึงว่าคุณสามารถสร้าง.dockerignoreไฟล์เพื่อแยกไฟล์ที่คุณไม่ต้องการคัดลอก:

https://docs.docker.com/engine/reference/builder/#dockerignore-file

ก่อนที่นักเทียบท่า CLI จะส่งบริบทไปยังนักเทียบท่า daemon มันจะค้นหาไฟล์ที่ชื่อว่า .ockerignore ในไดเรกทอรีรากของบริบท หากไฟล์นี้มีอยู่ CLI จะแก้ไขบริบทเพื่อแยกไฟล์และไดเรกทอรีที่ตรงกับรูปแบบในนั้น สิ่งนี้ช่วยในการหลีกเลี่ยงการส่งไฟล์และไดเรกทอรีขนาดใหญ่หรือละเอียดอ่อนไปยัง daemon และอาจเพิ่มลงในรูปภาพโดยใช้ ADD หรือ COPY

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