ใน Dockerfile ฉันมี
COPY . .
ฉันต้องการแยกไดเรกทอรีทั้งหมดในกรณีของฉันไดเร็กทอรี node_modules
บางสิ่งเช่นนี้
COPY [all but **/node_modules/**] .
เป็นไปได้กับนักเทียบท่า?
ใน Dockerfile ฉันมี
COPY . .
ฉันต้องการแยกไดเรกทอรีทั้งหมดในกรณีของฉันไดเร็กทอรี node_modules
บางสิ่งเช่นนี้
COPY [all but **/node_modules/**] .
เป็นไปได้กับนักเทียบท่า?
คำตอบ:
สร้างไฟล์.dockerignoreในไดเรกทอรีบริบทของการสร้างนักเทียบท่าของคุณ (ดังนั้นในกรณีนี้น่าจะเป็นไดเรกทอรีที่เป็นพาเรนต์ไปยัง node_modules) โดยมีหนึ่งบรรทัดในนั้น:
**/node_modules
แม้ว่าคุณอาจต้องการ:
node_modules
ข้อมูลเกี่ยวกับ dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file
/config/nginx/ /config/logstash/ฉันพบสิ่งนี้ใน container bash:ls config/ gunicorn logs logstash nginx
ls /config/คุณก็ลองเพิ่มเส้นทางเหล่านั้นเพื่อ .dockerignore ของคุณได้โดยไม่ต้องนำ/?
node_modulesไม่ทำงานในไดเรกทอรีย่อย
สำหรับผู้ที่ไม่สามารถใช้ไฟล์. 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'
ดำเนินการต่อไปจนกว่าคุณจะมีชื่อไฟล์เต็มหรือเพียงแค่นำหน้าคุณแน่ใจว่าจะไม่มีไฟล์อื่น
COPY failed: no source files were specifiedเมื่อไม่มีไฟล์ที่ขึ้นต้นด้วย 'ไม่' แต่ไม่ใช่ 'พยักหน้า'
src/จะไป/var/wwwและไปที่/conf/nginx.conf /etc/nginx/conf.d/default.confนอกจากนี้คุณสามารถคัดลอกทุกอย่างและRUN rm -r confต่อมา (เก็บต้นไม้ต้นกำเนิดไว้เหมือนเดิม) ฉันอยากจะฟังว่ามีใครมีข้อเสนอแนะอื่น
COPY [^node_modules]*คัดลอกไฟล์ระดับบนสุดทั้งหมด
ในกรณีของฉัน 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 ในระหว่างกระบวนการสร้างซึ่งเพิ่มเวลา
composer.lock composer installหากไม่มีไฟล์ล็อคชุดการพึ่งพาที่แตกต่างกัน (โฟลเดอร์ผู้จำหน่าย) อาจถูกติดตั้งเมื่อคุณสร้างครั้งต่อไป
การเพิ่ม .ockerignore เหมาะกับฉัน จุดหนึ่งที่เพิ่มเติมผู้ที่กำลังพยายามแก้ปัญหานี้บน Windows , windows จะไม่ยอมให้คุณสร้างไฟล์ .dockerignore (ตามที่มันไม่ได้โดยเริ่มต้นช่วยให้การสร้างไฟล์ที่เริ่มต้นด้วย.)
เพื่อสร้างไฟล์ดังกล่าวเริ่มต้นด้วย บน Windows , มีจุดสิ้นสุดยังชอบ.dockerignore.และกด Enter (ให้คุณได้เปิดใช้งานตัวเลือกขยายมุมมองจากตัวเลือกโฟลเดอร์)
ไม่รวม node_modules จากไดเร็กทอรีปัจจุบัน
node_modules
ไม่รวม node_modules ในไดเร็กทอรีย่อยใด ๆ ทันที
*/node_modules
นี่คือเอกสารอย่างเป็นทางการ
.dockerignoreล่ะ