คัดลอกด้วยนักเทียบท่า แต่ไม่รวม


231

ใน Dockerfile ฉันมี

COPY . .

ฉันต้องการแยกไดเรกทอรีทั้งหมดในกรณีของฉันไดเร็กทอรี node_modules

บางสิ่งเช่นนี้

   COPY [all but **/node_modules/**] .

เป็นไปได้กับนักเทียบท่า?


23
แล้วไง.dockerignoreล่ะ
Anthony Sottile

ฉันกำลังมองหาคำตอบสำหรับคำถามที่เกี่ยวข้องนี้: stackoverflow.com/questions/50547489/…
Alexander Mills

คำตอบ:


377

สร้างไฟล์.dockerignoreในไดเรกทอรีบริบทของการสร้างนักเทียบท่าของคุณ (ดังนั้นในกรณีนี้น่าจะเป็นไดเรกทอรีที่เป็นพาเรนต์ไปยัง node_modules) โดยมีหนึ่งบรรทัดในนั้น:

**/node_modules

แม้ว่าคุณอาจต้องการ:

node_modules

ข้อมูลเกี่ยวกับ dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file


5
ขอบคุณดังนั้น "COPY." คำสั่งไม่จำเป็นต้องเปลี่ยนฉันเดา
อเล็กซานเดอร์มิลส์

ไม่จริง: /config/nginx/ /config/logstash/ฉันพบสิ่งนี้ใน container bash:ls config/ gunicorn logs logstash nginx
SalahAdDin

3
@SalahAdDin ด้วยเหตุผลเดียวกับที่คุณไม่ได้เขียนls /config/คุณก็ลองเพิ่มเส้นทางเหล่านั้นเพื่อ .dockerignore ของคุณได้โดยไม่ต้องนำ/?
Pablo

8
เพียงแค่node_modulesไม่ทำงานในไดเรกทอรีย่อย
rustyx

5
นี้ไม่ได้จริงๆแก้ปัญหาถ้าคุณต้องการที่จะมีมัน COPY'd แต่เพียงไม่ได้อยู่ในชั้นที่ ...
เวสสตรีท

33

สำหรับผู้ที่ไม่สามารถใช้ไฟล์. docerignore (เช่นหากคุณต้องการไฟล์ในหนึ่ง COPY แต่ไม่ใช่ไฟล์อื่น):

ใช่ แต่คุณต้องมีคำแนะนำในการทำสำเนาหลายฉบับ คุณต้องมี COPY สำหรับจดหมายแต่ละฉบับในชื่อไฟล์ที่คุณต้องการยกเว้น

COPY [^n]*    # All files that don't start with 'n'
COPY n[^o]*   # All files that start with 'n', but not 'no'
COPY no[^d]*  # All files that start with 'no', but not 'nod'

ดำเนินการต่อไปจนกว่าคุณจะมีชื่อไฟล์เต็มหรือเพียงแค่นำหน้าคุณแน่ใจว่าจะไม่มีไฟล์อื่น


1
สิ่งนี้จะไม่สาโทเพราะคุณจะได้รับCOPY failed: no source files were specifiedเมื่อไม่มีไฟล์ที่ขึ้นต้นด้วย 'ไม่' แต่ไม่ใช่ 'พยักหน้า'
mheck

1
หรือคุณสามารถใช้สองแตกต่างกันไดเรกทอรีย่อย (สำหรับเป้าหมายสำเนาที่แตกต่างกัน) เพื่อให้เช่นในการตั้งค่า Nginx ของฉันฉันจะมีsrc/จะไป/var/wwwและไปที่/conf/nginx.conf /etc/nginx/conf.d/default.confนอกจากนี้คุณสามารถคัดลอกทุกอย่างและRUN rm -r confต่อมา (เก็บต้นไม้ต้นกำเนิดไว้เหมือนเดิม) ฉันอยากจะฟังว่ามีใครมีข้อเสนอแนะอื่น
Yuval

1
อะไรจะเป็นทางออกสำหรับไฟล์บางประเภทหรือไฟล์ที่ลงท้ายด้วยถ้าฉันจะทำเช่นนี้?
Lea Reimann

ข้อเสียเพียงอย่างเดียวของวิธีนี้คือโครงสร้างโฟลเดอร์ของคุณแบน
อิสลาม Q.

หากคุณมีเพียงไม่กี่ไดเรกทอรีที่จะคัดลอก (พูดเฉพาะ '/ app' หรือ '/ src') วิธีที่ง่ายกว่าคือการคัดลอกไดเรกทอรีทีละรายการ (เพื่อคงโครงสร้างไว้) จากนั้นคุณเพียงต้องการCOPY [^node_modules]*คัดลอกไฟล์ระดับบนสุดทั้งหมด
smdufb

9

ในกรณีของฉัน Dockerfile ของฉันมีขั้นตอนการติดตั้งซึ่งผลิตvendorไดเรกทอรี (เทียบเท่า PHP node_modules) ฉันแล้วCOPYไดเรกทอรีนี้ไปยังรูปภาพแอปพลิเคชันสุดท้าย ดังนั้นผมไม่สามารถวางในของฉันvendor .dockerignoreทางออกของฉันคือการลบไดเรกทอรีก่อนที่จะดำเนินการcomposer install(เทียบเท่า PHP npm install)

FROM composer AS composer
WORKDIR /app
COPY . .
RUN rm -rf vendor \
    && composer install 

FROM richarvey/nginx-php-fpm
WORKDIR /var/www/html
COPY --from=composer /app .

โซลูชันนี้ใช้งานได้และไม่ขยายภาพสุดท้าย แต่ไม่เหมาะเนื่องจากvendorไดเรกทอรีในโฮสต์จะถูกคัดลอกลงในบริบท Docker ในระหว่างกระบวนการสร้างซึ่งเพิ่มเวลา


3
หมายเหตุแน่ใจว่าทำไมคุณต้องลบก่อนcomposer.lock composer installหากไม่มีไฟล์ล็อคชุดการพึ่งพาที่แตกต่างกัน (โฟลเดอร์ผู้จำหน่าย) อาจถูกติดตั้งเมื่อคุณสร้างครั้งต่อไป
Lacek

1
@Lacek: ถูกต้อง ฉันเรียนรู้ได้ดีขึ้นตั้งแต่ฉันโพสต์สิ่งนี้
คาเมรอนฮัดสัน

1
@CameronHudson อาจอัพเดตคำตอบดั้งเดิมของคุณก่อนที่ผู้อื่นจะคัดลอก / วางการปฏิบัติที่ไม่ดีนี้
Robin van Baalen

2

การเพิ่ม .ockerignore เหมาะกับฉัน จุดหนึ่งที่เพิ่มเติมผู้ที่กำลังพยายามแก้ปัญหานี้บน Windows , windows จะไม่ยอมให้คุณสร้างไฟล์ .dockerignore (ตามที่มันไม่ได้โดยเริ่มต้นช่วยให้การสร้างไฟล์ที่เริ่มต้นด้วย.)

เพื่อสร้างไฟล์ดังกล่าวเริ่มต้นด้วย บน Windows , มีจุดสิ้นสุดยังชอบ.dockerignore.และกด Enter (ให้คุณได้เปิดใช้งานตัวเลือกขยายมุมมองจากตัวเลือกโฟลเดอร์)


6
คุณสามารถสร้างไฟล์ในหน้าต่างที่เริ่มต้นด้วยจุดโดยลงท้ายด้วยจุด
จิม Pedid

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