ละไฟล์ที่ไม่จำเป็นก่อน Build Image ด้วย .dockerignore

mixth
Zarewoft
Published in
2 min readJul 29, 2018

เรามักจะนำแอพเข้าไปไว้ใน image ด้วยคำสั่งที่ว่า

COPY . ./

ทั้งๆที่จริงๆแล้ว เราไม่จำเป็นต้องใช้ของทั้งหมดใน directory นี้ แต่จะให้เขียน COPY ทีละไฟล์ก็ไม่สะดวกเอาเสียเลยใช่ไหมครับ

ตัวอย่างไฟล์ที่เราอาจจะไม่อยากให้เข้าไปอยู่ใน Docker Image

  1. Logs
    เนื่องจากเป็นไฟล์ที่ไม่จำเป็นต้องใช้ ในบางครั้งหาก logs verbose เกินไปก็อาจจะทำให้คนอื่นๆเห็นข้อมูลบางอย่างได้อีกด้วย
  2. Version Control
    ใน final image ที่เราจะไปใช้งานใน production เราอาจจะไม่มีความจำเป็นต้องใช้ไฟล์กลุ่ม version control อยู่แล้ว จึงอาจจะพิจารณาไม่นำเข้าไปใน image ด้วยครับ เช่น .git เป็นต้น
  3. Secrets
    ในบางครั้งอาจจะไม่ควรนำเข้าไปใน image ด้วยครับ ทั้งในแง่ของการจัดการ environments (เพราะเราอาจจะได้นำ Image ไปรันที่อื่นๆ)
  4. Dependencies
    หากเราวางแผนจะ download และ build ของใหม่ทั้งหมดเลย เราก็ไม่จำเป็นต้องนำพวก dependencies เข้าไปใน image ตั้งแต่แรก เช่น node_modules เป็นต้น

ซึ่งเราสามารถเลี่ยงไม่ให้ COPY บางไฟล์เข้าไปใน image ได้ด้วยการใช้ .dockerignore ครับ

โดยสร้าง .dockerignore ใน directory เดียวกันกับ Dockerfile แล้วใส่ path ของไฟล์ที่เราไม่ต้องใช้ในการ build เข้าไปครับ เพียงเท่านี้จังหวะ build ไฟล์เหล่านี้ก็จะไม่เข้าไปใน build context ที่ใช้ในการสร้าง image ครับ

ตัวอย่าง .dockerignore

Build Context

ทุกๆครั้งที่เราสั่ง docker build เราจะเห็นตอนแรกสุดเลยมีบรรทัดที่เขียนว่า

การทำงานของ docker build คือเราจะต้องส่ง build context ไปให้ Docker daemon เพื่อใช้สร้าง image ครับ โดยกรณีที่เราสั่ง docker build . build context คือไฟล์ทั้งหมดใน directory

หาก build context มีขนาดใหญ่ เราก็จะเปลือง network, io สำหรับการส่งข้อมูลระหว่างผู้สร้างและ Docker daemon

ข้อควรระวัง

  • เนื่องจากไฟล์ที่เราระบุไว้ใน .dockerfile จะไม่ถูกส่งไปใน build context เลย ต่อให้ใน Dockerfile เราจะพยายาม COPY ยังไง มันก็จะหาไม่เจอนะครับ
  • .dockerignore ถึงจะใช้งานคล้ายกับ .gitignore แต่ว่าจะมี .dockerignore ใน subdirectory ไม่ได้นะครับ มีไปก็ไม่อ่านอยู่ดี

อย่าลืมนำ .dockerignore ไปใช้เพื่อลดของที่ต้องส่งไปสร้าง image และลดการ expose ของสำคัญๆใน Docker image ของเรา โดยเฉพาะ .git, logs, dependencies ต่างๆกันนะครับ 😃

หากมีส่วนใดผิดพลาด ไม่ถูกต้อง แจ้งได้เลยครับ

--

--

mixth
Zarewoft

🇹🇭 BKK based 👨‍💻 software engineer 🐈 love cats 🌟 push for more democratic and more transparent gov 🍿 watch way too much movies and tv series