ยินดีต้อนรับสู่ Arcane Weekly วันนี้พูดถึงปัญหาที่ไม่น่าจะเจอ แต่ถ้าเจอ ต้องการแก้ไขด่วน เครื่องมือ: LXD containers, Docker ภารกิจ: รันทั้งสองพร้อมกัน โดยเฉพาะ spawn LXD container แล้วภายในเริ่ม Docker container ทำไม? ทำไมไม่
ปัญหาคือ Docker execution fail ด้วย error:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: process_linux.go:495: container init caused: rootfs_linux.go:60: mounting "proc" to rootfs at "/proc" caused: permission denied: unknown.
ข้อความเยอะมาก สร้าง misleading trail มีหลายสาเหตุ ในกรณีของผม setup ใหม่ vanilla ไม่มี customizations ไม่มี error อื่น Docker ติดตั้งและตั้งค่าถูกต้อง
คิดว่าอาจดู LXD ทำงานยังไง อาจเข้าใจได้ดีขึ้น พบบทความเก่า semi-documented เกี่ยว LXD อธิบายสถานการณ์: เพื่อเหตุผลความปลอดภัย containers ไม่อนุญาตเข้าถึง /proc และ /sys แบบ unsafe workaround - พร้อม security implications - คืออนุญาตการเข้าถึง
วิธีแก้ (Solution)
ต้องอนุญาต nesting สำหรับคอนเทนเนอร์ที่ได้รับผลกระทบ
lxc launch "image" "container name" -c security.nesting=true
ถ้าคอนเทนเนอร์มีอยู่แล้ว ก่อน start:
lxc config set "container name" security.nesting true
แล้ว start คอนเทนเนอร์:
lxc start "container name"
ถ้ารันอยู่แล้ว ให้ stop ตั้ง policy แล้ว start ใหม่ 操作 non-destructive ถ้าเจอปัญหาหลัง spawn แล้ว ไม่สูญเสียงานหรือข้อมูล setting ยัง reversible อีกด้วย งานเสร็จสิ้น
สรุป (Conclusion)
น่าสนใจที่ผมเจอปัญหานี้ตอนนี้ ซึ่งมีมาปี 5 แล้ว หรือคนเยอะเจอแต่มูลนิยอืดขัดขื้น หากทำ nested containers ให้แก้ security policy สำหรับคอนเทนเนอร์ใน LXD trick เรียบง่าย มีรายละเอียดเพิ่ม เช่น privileged/unprivileged containers และ security considerations แต่ถ้างานไม่เกี่ยว security ไม่มี downside
เอกสารที่ดีกว่าจะช่วย ข้อความ error ที่ไม่คิดนิดก็ดี ขณะนี้ ลองคิดว่าทำไมใน setup ของคุณถึงมี permission errors สำหรับสิ่งที่พยายามทำ นี่นำคุณไปทางถูกต้อง เมื่อรู้จัก frame problem statement แล้ว ทำได้ 80% ตอนนี้ทำ containers within containers ได้ แบบ: Yo Dawn, I herd u like containers, so we put containers in your containers ... Inception โบนัส: ลองดู nesting หลาย level ได้ก่อนจักรวาล implodes
Cheers.