เรามักจะนำแอพเข้าไปไว้ใน image ด้วยคำสั่งที่ว่า
COPY . ./
ทั้งๆที่จริงๆแล้ว เราไม่จำเป็นต้องใช้ของทั้งหมดใน directory นี้ แต่จะให้เขียน COPY
ทีละไฟล์ก็ไม่สะดวกเอาเสียเลยใช่ไหมครับ
ตัวอย่างไฟล์ที่เราอาจจะไม่อยากให้เข้าไปอยู่ใน Docker Image
- Logs
เนื่องจากเป็นไฟล์ที่ไม่จำเป็นต้องใช้ ในบางครั้งหาก logs verbose เกินไปก็อาจจะทำให้คนอื่นๆเห็นข้อมูลบางอย่างได้อีกด้วย - Version Control
ใน final image ที่เราจะไปใช้งานใน production เราอาจจะไม่มีความจำเป็นต้องใช้ไฟล์กลุ่ม version control อยู่แล้ว จึงอาจจะพิจารณาไม่นำเข้าไปใน image ด้วยครับ เช่น.git
เป็นต้น - Secrets
ในบางครั้งอาจจะไม่ควรนำเข้าไปใน image ด้วยครับ ทั้งในแง่ของการจัดการ environments (เพราะเราอาจจะได้นำ Image ไปรันที่อื่นๆ) - Dependencies
หากเราวางแผนจะ download และ build ของใหม่ทั้งหมดเลย เราก็ไม่จำเป็นต้องนำพวก dependencies เข้าไปใน image ตั้งแต่แรก เช่นnode_modules
เป็นต้น
ซึ่งเราสามารถเลี่ยงไม่ให้ COPY
บางไฟล์เข้าไปใน image ได้ด้วยการใช้ .dockerignore
ครับ
โดยสร้าง .dockerignore
ใน directory เดียวกันกับ Dockerfile
แล้วใส่ path ของไฟล์ที่เราไม่ต้องใช้ในการ build เข้าไปครับ เพียงเท่านี้จังหวะ build ไฟล์เหล่านี้ก็จะไม่เข้าไปใน build context ที่ใช้ในการสร้าง image ครับ
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 ต่างๆกันนะครับ 😃
หากมีส่วนใดผิดพลาด ไม่ถูกต้อง แจ้งได้เลยครับ