ใน 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
ล่ะ