เจาะลึก Dockerfile: CMD คืออะไร ทำไมต้องมี และต่างจาก RUN อย่างไร?

อ่าน 3 นาที 2 ผู้อ่าน

เจาะลึก Dockerfile: CMD คืออะไร ทำไมต้องมี และต่างจาก RUN อย่างไร?

ทำไม Container ถึงปิดตัวเองทันทีที่รัน?

เวลาเราเขียน Dockerfile แล้วสั่งสร้าง Container (กล่องที่ห่อโปรแกรมและสิ่งที่จำเป็นไว้ให้รันที่ไหนก็ได้เหมือนกัน) มักจะเจอปัญหาว่าพอกดรันปุ๊บ โปรแกรมก็ดับไปทันที เพราะ Docker ไม่รู้ว่าเมื่อเปิดกล่องมาแล้ว ต้องสั่งให้โปรแกรมไหนทำงานเป็นอย่างแรก

หากเราไม่บอก Docker ว่าต้องทำอะไรต่อ มันจะแค่เปิดกล่องขึ้นมาแล้วปิดไปเฉยๆ เพราะไม่มีกระบวนการหลักที่ต้องดูแล การจะให้โปรแกรมรันค้างไว้ได้ เราต้องใช้คำสั่งที่ชื่อว่า CMD เพื่อกำหนดว่าเมื่อรัน Container แล้ว ให้ทำคำสั่งอะไรเป็นค่าเริ่มต้น

RUN vs CMD ต่างกันตรงไหน?

หลายคนสับสนระหว่าง RUN และ CMD เพราะทั้งคู่ใช้สั่งงานเหมือนกัน แต่จังหวะการใช้งานต่างกันอย่างสิ้นเชิง

  • RUN: ใช้ตอนช่วง Build (ขั้นตอนการสร้าง Image หรือพิมพ์เขียวของโปรแกรม) เช่น ติดตั้งโปรแกรมเสริม หรือดาวน์โหลด Library ต่างๆ
  • CMD: ใช้ตอนช่วง Run (ขั้นตอนการเปิดใช้งาน Container จริงๆ) คือการบอกว่าพอเปิดเครื่องมาแล้ว ให้โปรแกรมทำงานด้วยคำสั่งอะไร

คิดง่ายๆ ว่า RUN คือการเตรียมของก่อนเปิดร้าน ส่วน CMD คือการกดเปิดสวิตช์ไฟเมื่อเปิดร้านแล้ว

การใช้ CMD แบบ Exec Form

วิธีเขียน CMD ที่ดีที่สุดคือแบบ Exec Form ซึ่งเขียนอยู่ในรูปของอาเรย์ เช่น CMD ["go", "run", "server.go"] วิธีนี้จะช่วยให้ Docker ส่งสัญญาณคำสั่งไปที่โปรแกรมโดยตรง ทำให้การจัดการ Process (ขั้นตอนการทำงานของคอมพิวเตอร์) ทำได้แม่นยำกว่า

สั่ง Override คำสั่งเดิมได้ง่ายๆ

ข้อดีของ CMD คือมันเป็นแค่ค่าเริ่มต้น ถ้าวันไหนเราอยากลองรันคำสั่งอื่นเพื่อทดสอบหรือแก้ปัญหา (Debug) เราสามารถสั่งทับได้ทันที เช่น docker run image_name bash แทนที่โปรแกรมจะรันตาม CMD ปกติ มันจะเปิดหน้าต่าง Terminal (หน้าจอพิมพ์คำสั่ง) ให้เราเข้าไปเช็คข้างในแทน

ที่สำคัญคือ การทำแบบนี้ไม่ได้เปลี่ยนค่าในตัว Image (พิมพ์เขียว) เดิมของเรา แค่เป็นการสั่งเฉพาะตอนรันครั้งนั้นๆ เท่านั้น

สรุปสั้น ๆ

ถ้าอยากให้โปรแกรมรันอัตโนมัติเมื่อเปิด Container ให้ใช้ CMD เสมอ จำไว้ว่า RUN ไว้ใช้ตอนสร้าง (Build) ส่วน CMD ไว้ใช้ตอนรัน (Run) การแยกสองส่วนนี้ออกจากกันจะช่วยให้คุณเขียน Dockerfile ได้เป็นระเบียบและไม่สับสนเวลาโปรแกรมทำงานผิดพลาด

แชร์ข่าวนี้

เรียบเรียงจากข่าวของ DEV Community อ่านข่าวต้นฉบับ ↗

← กลับไปหน้าข่าวสาร