Dockerignore Generator: สร้าง .dockerignore ให้ Image เล็ก สร้างเร็ว และปลอดภัย
รู้จักกับ Dockerignore Generator เครื่องมือสร้างไฟล์ .dockerignore จาก preset สำหรับ Node.js, Python, Go, Java และอื่น ๆ ช่วยให้ build context เล็ก สร้างเร็ว และไม่มี secrets หลุดไปกับ image
Table of Contents
ทุกครั้งที่รัน docker build จะเริ่มด้วยขั้นตอนเดียวกันเสมอ — Docker client จะแพ็กโฟลเดอร์โปรเจกต์ของเราทั้งหมดส่งไปให้ daemon ในรูปแบบของ build context ถ้าในโฟลเดอร์มี node_modules, .git, virtual environment, build artifacts หรือไฟล์ .env ที่ลืมไว้ ทั้งหมดจะถูก upload ไปด้วยทุกครั้งที่ build ทางแก้คือไฟล์ .dockerignore และวิธีที่เร็วที่สุดในการสร้างไฟล์ที่ถูกต้องคือใช้ Dockerignore Generator เครื่องมือฟรีที่ประกอบไฟล์ .dockerignore พร้อมใช้งานจาก preset สำหรับ Node.js, Python, Go, Java, Rust, .NET, PHP และ frameworks ยอดนิยม
การไม่มี .dockerignore ถือเป็นหนึ่งในความผิดพลาดที่พบบ่อยที่สุดและแพงที่สุดในโลกของ Docker — มันทำให้ build context บวม ทำลาย layer caching หลุด secrets เข้าไปอยู่ใน image และทำให้ CI pipeline ที่ build container ช้าลงทุกขั้นตอน ทั้งที่คนส่วนใหญ่แก้ปัญหานี้แค่ก๊อป snippet ห้าบรรทัดจาก blog มาใช้แล้วภาวนาให้มัน work
Dockerignore Generator ใช้แนวทางที่ต่างออกไป — เครื่องมือเก็บรวบรวม preset pattern packs กว่ายี่สิบชุด จัดกลุ่มเป็น 7 หมวด ได้แก่ languages, frameworks, Docker & CI, editors, operating systems, version control และ security ให้เราเลือกประกอบ ignore rules ที่ตรงกับโปรเจกต์ ตรวจทาน แล้ว export ไฟล์ .dockerignore เสร็จภายในหนึ่งนาที ในบทความนี้เราจะพาดูวิธีใช้เครื่องมือ หลักการทำงานของ .dockerignore เบื้องหลัง และแนวปฏิบัติที่แยก image ที่สะอาดออกจาก image ที่บวมโต
ทำไมต้องใช้ Dockerignore Generator
- Build context เล็กลง = build เร็วขึ้น Docker ต้อง upload context ทั้งหมดก่อนรัน instruction แรก การตัด node_modules, .git และ cache ออกอาจย่อจาก 500 MB เหลือไม่กี่ megabyte — คือความต่างระหว่าง CI build สามนาทีกับยี่สิบวินาที
- Layer caching ดีขึ้น ไฟล์ที่เปลี่ยนบ่อย (logs, config ท้องถิ่น, สถานะ editor) ทำให้ cache layer ของ COPY . . ใช้ไม่ได้ทุกครั้ง การ ignore พวกนี้ช่วยให้ cache hit สูงและ rebuild เร็ว
- Secrets ไม่หลุดเข้า image ไฟล์ .env, TLS keys และ cloud credentials ไม่ควรเข้าสู่ build context ตั้งแต่แรก เพราะเมื่อ secret ไปอยู่ใน layer แล้ว มันคือ permanent — แม้จะลบทิ้งใน instruction ถัดไป มันก็ยังอยู่ใน layer ก่อนหน้า
- Preset ที่ curate แล้ว ไม่ต้องเดา แต่ละ pack (Node.js, Python, Go, Java/Maven, Gradle, Rust, .NET, PHP, Next.js, React/Vite, Nuxt) เก็บ patterns ที่ stack นั้นสร้างจริง เช่น __pycache__ สำหรับ Python หรือ target/ สำหรับ Rust — ไม่ใช่คำเดาลอย ๆ
- จัดการขยะจาก OS และ editor ให้เลย มี pack เฉพาะสำหรับตัดโฟลเดอร์จาก editor (.vscode, .idea) ของจาก OS (.DS_Store, Thumbs.db) และที่เก็บ credentials (.aws, .ssh, **/*.pem, **/*.key)
- เป็น private โดย design ทุกอย่างรัน client-side ใน browser ไม่มีการ upload เนื้อหาไฟล์ ชื่อ pattern หรือชื่อโปรเจกต์ไปไหนทั้งสิ้น
ฟีเจอร์เด่น
| ฟีเจอร์ | ทำอะไร |
|---|---|
| Preset packs 20+ ชุด | Ignore patterns คัดสรรรายภาษา, framework และเครื่องมือ |
| 7 หมวดหมู่ | Languages, Frameworks, Docker & CI, Editors, OS, Version Control, Security |
| Live search | กรอง presets ทั้งหมดแบบทันที หา pack ที่ต้องการไวขึ้น |
| Custom patterns | เพิ่ม ignore rules เฉพาะของโปรเจกต์เองได้ |
| Copy & download | ก๊อปขึ้น clipboard หรือดาวน์โหลดเป็นไฟล์ .dockerignore ได้ในคลิกเดียว |
| รันบน browser 100% | ไม่ต้อง upload ไม่ต้องสมัคร account ไม่มี telemetry |
สองจุดที่อยากเน้นเป็นพิเศษ อย่างแรกคือ Secrets & Env pack — pack ที่ทีมส่วนใหญ่ข้ามและเสียใจทีหลังมากที่สุด เพราะมันครอบคลุม **/.env, **/.env.*, **/*.pem, **/*.key, **/secrets/, **/credentials*, .aws และ .ssh ในคลิกเดียว อย่างที่สองคือ Docker & CI pack ที่ตัด Dockerfile และ docker-compose*.yml ออกจาก context ด้วย — เป็น best practice ที่คนมองข้าม เพราะ Dockerfile ถูกส่งไป daemon แยกอยู่แล้ว ไม่จำเป็นต้องถูก copy เข้า image เว้นแต่จะ COPY เองชัด ๆ
วิธีใช้งาน
- เปิด Dockerignore Generator — ไม่ต้องสมัครสมาชิก
- เลือก preset packs ที่ตรงกับ stack เริ่มจากภาษา (เช่น Node.js) และ framework (เช่น Next.js)
- เพิ่ม Security pack เพื่อตัดไฟล์ .env, keys และโฟลเดอร์ credentials ออก
- พิมพ์ custom patterns เฉพาะของ repo เรา (เช่น coverage/ หรือ *.local.json) ในช่อง custom patterns
- กด Copy เพื่อก๊อปไฟล์ขึ้น clipboard หรือกด Download บันทึกเป็น .dockerignore ไว้ที่ root ของโปรเจกต์ — แล้วลอง rebuild ดูว่า context size ลดลงขนาดไหน
ทำความเข้าใจ .dockerignore
จะใช้ไฟล์นี้ให้ดี ควรรู้ก่อนว่า Docker ทำอะไรกับมันบ้าง
Build context คือการ upload ไม่ใช่การอ้างอิงไฟล์ เวลารัน docker build . client จะ tar ทั้งไดเรกทอรี (หักไฟล์ที่ถูก ignore) แล้ว stream ไปหา daemon context หลาย gigabyte ไม่ได้แค่ทำให้ build ช้า — บน remote daemon และ CI runner มันกิน bandwidth ทุกครั้งที่ build ไฟล์ .dockerignore ถูกประเมินก่อนที่ instruction ใด ๆ ใน Dockerfile จะรัน ดังนั้นไฟล์ที่ถูก exclude จะไม่เข้า context ตั้งแต่แรก
.dockerignore ไม่ใช่ .gitignore syntax หน้าตาคล้ายกันแต่พฤติกรรมต่างกัน Docker ใช้ filepath.Match ของ Go พร้อมรองรับ ** — **/*.log จับไฟล์ log ทุกความลึก ส่วน *.log จับเฉพาะที่ root และสามารถ re-include ไฟล์ที่ exclude ไปแล้วด้วย pattern ที่ขึ้นต้นด้วย ! โดย Docker อ่านจากบนลงล่าง นอกจากนี้การ ignore ใน .dockerignore ไม่เกี่ยวกับสถานะ tracked แบบ Git — ทุกไฟล์ในไดเรกทอรีถูกหยิบขึ้นมาเสมอ เว้นแต่ถูก ignore
ตำแหน่งไฟล์สำคัญ ไฟล์ต้องชื่อ .dockerignore เป๊ะ ๆ และอยู่ที่ root ของ build context — ไดเรกทอรีเดียวกับที่ชี้ docker build ไปที่ ถ้าใช้ BuildKit จะมีตัวเลือก per-Dockerfile อย่าง Dockerfile.dockerignore สำหรับ multi-stage setups แต่ไฟล์ .dockerignore ที่ root ยังเป็น default
Caching ผูกกับสิ่งที่ถูก copy COPY . . สร้าง layer ที่ cache key รวม checksum ของทุกไฟล์ที่ copy ถ้าไฟล์ผันผวน (logs, .env ท้องถิ่น, ผลลัพธ์ test) ติดไปด้วย ทุก build จะ invalidate layer นั้นและทุกอย่างหลังจากนั้น .dockerignore ที่แน่นหนาช่วยให้ layer นั้นนิ่ง dependencies ที่ไม่เปลี่ยนก็ใช้ cache ต่อ มีแต่ source ที่เปลี่ยนจริง ๆ ที่ trigger rebuild — ความเร็วที่เห็นจริงใน production มาจากจุดนี้เป็นหลัก
Use Case ในทางปฏิบัติ
Image สำหรับ Node.js API
Service แบบ Express หรือ Fastify ทั่วไปมักมี node_modules (มักเกิน 300 MB ถ้า install ไว้ในเครื่อง), npm-debug.log, .npm และ .env กองอยู่ การเลือก Node.js + Secrets & Env packs ตัดทั้งหมดออกได้ เพราะ Dockerfile ของเรารัน npm ci อยู่ใน image อยู่แล้ว ของที่ install ไว้ในเครื่องจึงเป็นน้ำหนักตายใน context — ตัดทิ้งได้ context เล็กลง 90% ขึ้นไปแบบปกติ
Container สำหรับ Python และงาน ML
โปรเจกต์ ML คือตัวการร้ายที่สุด — __pycache__, virtual environment (.venv, venv), .pytest_cache, *.egg-info, model checkpoints และโฟลเดอร์ dataset รวมกันได้หลาย gigabyte Python pack จัดการ artifacts ของ interpreter ส่วนของใหญ่กว่านั้นอย่าง data/, models/ หรือ *.ckpt ให้เพิ่มเป็น custom patterns เอง แล้ว working copy 6 GB ในเครื่องจะเหลือ context upload แค่ 4 MB
CI/CD pipelines
บน GitHub Actions, GitLab CI หรือ Jenkins การ build มักรันบน ephemeral runners ที่ต้องส่ง checkout ทั้งก้อนไปหา Docker daemon หรือ remote builder อยู่ดี CI/CD pack ตัด .github, .gitlab-ci.yml, .circleci และ Jenkinsfile ส่วน Git pack ตัด .git ทิ้งทั้งก้อน — ซึ่งมักเป็นไดเรกทอรีที่ใหญ่ที่สุดใน repo ที่ clone มาใหม่ context transfer เร็วขึ้น = pipeline wall-clock time สั้นลงทันที
ความสะอาดของ secrets และ compliance
ถ้า policy ความปลอดภัยบอกว่าห้ามมี credentials ใน image Security pack คือชั้นบังคับใช้ให้อัตโนมัติ — **/.env, **/*.pem, **/*.key, **/secrets/, **/credentials*, .aws และ .ssh ถูก exclude ก่อนที่ Dockerfile จะได้รัน จับคู่กับ multi-stage builds เพื่อให้ build-time dependencies ไม่ติดไปใน final layer และ scan image ใน CI เพื่อจับสิ่งที่อาจหลุดรอด
Best Practices
- เริ่มจาก preset แล้วค่อยตัดทอน presets ตั้งใจให้ครอบคลุมไว้ก่อน — review ไฟล์ที่ได้แล้วลบ patterns ที่โปรเจกต์เราไม่ได้สร้าง เพื่อให้ไฟล์อ่านแล้วมีความหมายกับเพื่อนร่วมทีม
- ห้ามให้ .env เข้า context เด็ดขาด แม้ Dockerfile จะไม่เคย copy มัน แต่ docker history หรือ COPY . . ในอนาคตสามารถเปิดโปงมันได้ ให้ถือว่าการ exclude secrets เป็นเรื่องที่ต่อรองไม่ได้
- เก็บไฟล์ไว้ที่ root ของ repo ข้าง Dockerfile .dockerignore ที่อยู่ใน subdirectory จะถูกเมินเฉย ๆ ซึ่งเป็นสาเหตุของ bug ยอดฮิตที่หาสาเหตุยากมาก
- เช็ก context size ใหม่ทุกครั้งที่เพิ่มเครื่องมือ เครื่องมือใหม่ (coverage reporters, linters, package managers) มักพาโฟลเดอร์ artifacts ใหม่มาด้วย — เจอเมื่อไหร่ให้เพิ่มเป็น custom patterns เลย
- Ignore ทิ้ง Dockerfile และ compose files พวกมันถูกส่งไป daemon แยกอยู่แล้ว การ copy เข้า image มักแค่ทำให้ image บวมโดยไม่มีประโยชน์
- อย่า exclude ไฟล์ที่ตัวเอง COPY ชัด ๆ ถ้า Dockerfile มี COPY config/production.json ต้องแน่ใจว่ามันไม่โดน pattern ใดจับ — ไม่งั้น build จะ fail ด้วย error "not found" ที่งงมาก
ลองใช้เลยตอนนี้
เข้าไปที่ Dockerignore Generator เลือก presets ของ stack ที่ใช้ แล้ว export ไฟล์ .dockerignore ที่สะอาดภายในหนึ่งนาที log ของ CI จะแสดง context transfer ที่เล็กลง layer cache จะอยู่รอดผ่าน rebuilds ได้มากขึ้น และทีม security จะนอนสบายขึ้นเพราะ .env ไม่เคยออกจากเครื่องเราเลย ฟรี ไม่ต้องมี account และรันบน browser ของเราทั้งหมด
เครื่องมือที่เกี่ยวข้อง
- Robots.txt Generator — ควบคุมว่า crawlers เห็น site เราอย่างไร
- .htaccess Generator — สร้าง Apache config โดยไม่ต้องต่อสู้กับ syntax
- CSP Header Generator — สร้าง Content-Security-Policy headers อย่างมั่นใจ
ขอให้สนุกกับการ ship!