Dockerignore: ละเว้นทุกอย่างยกเว้นไฟล์และ Dockerfile


92

ดังนั้นความตั้งใจหลักคือการเทียบเคียงแอปพลิเคชันโถไขมันและใส่ลงใน Elasticbeanstalk ปัญหาอยู่ที่บริบท มันค่อนข้างโง่เล็กน้อยที่จะเพิ่มบริบทให้กับนักเทียบท่าถ้าสิ่งที่ฉันต้องการคือไฟล์ jar เดียว

ฉันเล่นกับไฟล์. dockerignore มาแล้ว แต่ฉันหลงทาง ฉันพยายามใช้การปฏิเสธ gitignore แต่ไม่ได้ผล

*
!Dockerfile
*/
!target/
target/*
!target/*.jar

นอกจากนี้ยังมีสิ่งนั้นด้วย regex แต่ดูเหมือนว่าไม่รองรับ regex ที่ซับซ้อน

^((?!Dockerfile).)*$

ฉันได้ลองค้นหาใน stackoverflow แล้วและสองสิ่งนี้คือทั้งหมดที่ฉันพบ:

คำถามนี้อาจคล้ายกับคำถามที่สอง แต่ฉันคิดว่ามันแตกต่างกันเล็กน้อยตั้งแต่ที่นี่ฉันแค่ต้องการรวมไฟล์เดียวลงในบริบท

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม.


เครื่องหมายอัศเจรีย์สำหรับโฟลเดอร์ใช้ได้ผลกับฉัน!
Ivan Aracki

คำตอบ:


135

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

# Ignore everything
**

# Allow files and directories
!/file.txt
!/src/**

# Ignore unnecessary files inside allowed directories
# This should go after the allowed directories
**/*~
**/*.log
**/.DS_Store
**/Thumbs.db

8
ตามเอกสารของ Dockerควรใส่เฉพาะ*ในบรรทัดแรกเท่านั้น(แทน**) คำพูด: "คุณอาจต้องการระบุไฟล์ที่จะรวมไว้ในบริบทแทนที่จะแยกออกเพื่อให้บรรลุสิ่งนี้ให้ระบุ*เป็นรูปแบบแรกตามด้วย!รูปแบบข้อยกเว้นอย่างน้อยหนึ่งรูปแบบ"
Johnny Thunderman

32

จากข้อมูลอ้างอิง dockerfile :

นอกเหนือจากเส้นทางไฟล์ของ Go กฎการจับคู่ Docker ยังรองรับสตริงตัวแทนพิเศษ ** ที่ตรงกับไดเรกทอรีจำนวนเท่าใดก็ได้ (รวมถึงศูนย์) ตัวอย่างเช่น ** / *. go จะยกเว้นไฟล์ทั้งหมดที่ลงท้ายด้วย. go ที่พบในไดเร็กทอรีทั้งหมดรวมถึงรูทของบริบทบิลด์

ดังนั้นบรรทัดที่มีเพียง ** จะไม่สนใจทุกอย่างในไดเร็กทอรีเดียวกับ Dockerfile

ตามที่คาดไว้อัศเจรีย์สามารถใช้เพื่ออ้างอิงไฟล์ใด ๆ ที่คุณต้องการส่งไปยัง docker daemon


3
สิ่งสำคัญอย่างยิ่งที่**จะต้องไปที่ด้านบนสุดของไฟล์มิฉะนั้นการยกเว้นจะถูกละเว้น นักเทียบท่าใช้กฎสุดท้ายที่จับคู่เป็นกฎ "ขั้นสุดท้าย" ดังนั้นหาก**สุดท้ายแล้วมันจะจับคู่ทุกอย่าง
tedivm

3
ดังนั้นเพิ่ม**ในบรรทัดแรกและ!fooในบรรทัดถัดไปหากfooเป็นไฟล์เดียวที่คุณต้องการรวม
Saca

9

สิ่งนี้อาจฟังดูแปลก แต่ถ้าคุณต้องการเพียงแค่ไฟล์ jar เดียวคุณสามารถสร้างโฟลเดอร์ "docker" ในระบบบิลด์ที่มี Dockerfile ของคุณได้ เมื่อคุณเรียกใช้งานบิลด์ให้สคริปต์บิลด์คัดลอกไฟล์ jar เดียวไปยัง "นักเทียบท่า" จากนั้นเรียกใช้งานบิลด์อิมเมจนักเทียบท่า (จากภายในโฟลเดอร์ "นักเทียบท่า") และพุชไปยังรีจิสทรีนักเทียบท่าของคุณเมื่อเสร็จสิ้น


2
สวัสดีมันฟังดูไม่แปลกเลย ฉันคิดว่ามันเป็นแนวทางปฏิบัติทั่วไป แต่ฉันกำลังมองหาวิธีที่จะทำกับ. dockerignore ถ้าเป็นไปได้ นอกจากนี้ฉันไม่ค่อยชอบ mvn xml :)
Rowanto

คุณสามารถรวมทั้งสองวิธีได้โดยใส่ dockerfile ไว้ในไดเร็กทอรีย่อยและใช้. dockerignore ตามเอกสารมันเป็นการดีที่จะทำเช่นนั้นต่อไป
โจนาธานลี

เอกสารของ Docker : ในกรณีส่วนใหญ่ควรเริ่มต้นด้วยไดเร็กทอรีว่างเป็นบริบทและเก็บ Dockerfile ไว้ในไดเร็กทอรีนั้น เพิ่มเฉพาะไฟล์ที่จำเป็นสำหรับการสร้าง Dockerfile คำเตือน: อย่าใช้ไดเร็กทอรีรากของคุณ / เป็น PATH เนื่องจากทำให้บิลด์โอนเนื้อหาทั้งหมดของฮาร์ดไดรฟ์ของคุณไปยัง Docker daemon
Jonathan Lee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.