ปัญหา เวลาสร้าง docker container เพื่อ run งานแบบอัตโนมัติ เราก็จำเป็นต้องใช้ cron แต่ว่า เจ้า docker container images เนี่ย จะเป็นรุ่นตัดทุกอย่างที่ไม่จำเป็นออกหมด เอาไว้ให้ start – run – stop แต่ถึงกระนั้น เราก็ยังอยากได้การทำงานแบบ cron อยู่ดี Reproduce สร้าง docker container จาก ubuntu:20.04 ตรวจสอบว่ามี crontab หรือไม่ ก็ไม่มี /var/log/syslog มีไม๊ ก็ไม่มี systemctl มีไม๊ ก็ไม่มี แก้ไข ติดตั้ง 3 อย่าง cron, systemctl, rsyslog แล้ว ขอแถม vim ด้วย ติดตั้งแล้ว ลองตรวจสอบ ก็พบว่า crontab มาแล้ว, systemctl มาแล้ว ส่วน /var/log/syslog ยังไม่ได้สร้าง ลอง start cron และ rsyslog ดู ก็พบว่า /var/log/syslog มาแล้ว ทดสอบสร้าง cron ทำความเข้าใจก่อน crontab เอาไว้สร้าง cron ส่วนตัวของแต่ละ user แต่ที่ /etc/cron.d/ นั้น เอาไว้สร้างสำหรับ system 2 วิธีการสร้าง cron นี้แตกต่างกันที่ crontab ไม่สามารถระบุผู้ใช้ได้ แต่ใน /etc/cron.d/ นั้น สามารถระบุ user ที่จะ run ได้ ต่อไป จะสร้าง cron ง่าย ๆ ให้ echo เวลา ทุก 1 นาทีลงไฟล์ แล้วใส่ บรรทัดนี้ลงไป ดูใน /var/log/syslog แล้ว ก็พบว่า ทำงานได้ ดูผลใน -/test.log เป็นอันว่า OK ต่อไป ดูว่า ถ้า restart docker แล้ว cron จะทำงานไม๊ ? ทดสอบ restart docker container ออกจาก bash ของ docker แล้วใช้คำสั่ง รอสัก 3 นาที แล้วใช้คำสั่ง ผลที่ได้คือ อ้าว cron ไม่ทำงานต่อ มาดูเหตุกันก่อน เราต้องไปดู รากเหง้าของ ubuntu:20.04 image https://hub.docker.com/_/ubuntu Docker ทำงานโดยจะทำเพียงคำสั่งเดียว การสร้าง docker image จะสร้างจาก Dockerfile ซึ่ง ubuntu:20.04 มี Dockerfile ดังนี้ แสดงว่า docker container ที่ใช้ ubuntu:20.04 (ตัวอื่น ๆ ก็ต้องตามไปดูกัน) ก็จะเรียก Bash เป็นคำสั่งสุดท้าย ก่อนจะยืนเป็น Service ให้ใช้งาน ดังนั้น … เราก็ต้องไปทำให้ start cron service ใน .bashrc กัน ประเด็นคือ มัน start ด้วย user ไหน ? ลองใช้คำสั่งนี้ ก็แสดงว่า สำหรับ image ตัวนี้