ฉันได้ติดตั้ง lxd บนโฮสต์อูบุนตูสองตัวที่สามารถสื่อสารผ่านเซิร์ฟเวอร์ระดับกลางเท่านั้น (ซึ่งฉันไม่มีสิทธิ์ su) ฉันได้สร้างคอนเทนเนอร์บน localhost ของฉันแล้ว และตอนนี้ต้องการโหลดคอนเทนเนอร์บนเซิร์ฟเวอร์ระยะไกล

ฉันปรึกษาสคริปต์ทดสอบbasic.shใน lxc/lxd repo เพื่อยืนยันว่าฉันกำลังใช้แนวทางที่ถูกต้อง (ฉันค้นพบระหว่างทางที่ฉันเข้าใจผิดเกี่ยวกับรูปภาพกับคอนเทนเนอร์)

ฉันได้สร้างการทดสอบคอนเทนเนอร์บน localhost ของฉัน ติดตั้งสารพัดที่จำเป็นทั้งหมดภายใน หยุด เผยแพร่ และดำเนินการคำสั่งต่อไปนี้:

lxc image export test

สิ่งนี้ทำให้ฉันมี tarball 42cf01c53cb9e...83e3c48.tar.gz (ย่อไว้ที่นี่) ตามที่อธิบายไว้ในเอกสารประกอบ (ฉันใช้ lxc และ lxd เวอร์ชัน 2.0.0.beta3) กำลังพยายามนำเข้ารูปภาพนั้นบนโฮสต์เดียวกันผ่าน

lxc image import 42cf01c53cb9e...83e3c48.tar.gz --alias testimage

ทำให้เกิดข้อผิดพลาด:

exit status 2 (tar: metadata.yaml: Not found in archive)

basic.shนำไปสู่สคริปต์ให้เชื่อว่าผมต่อไปนี้เส้นทางที่ถูกต้องแม้ว่า (ยกเว้น tar.gz VS tar.xz descrepancY) ที่ ฉันสามารถส่งออกรูปภาพมาตรฐานและรับไฟล์ .xz (เมื่อฉันรับรูปภาพโดยใช้ lxd-images) ตัวอย่างเช่น,

lxd-images import ubuntu --alias ubuntu
lxc image export ubuntu

สร้างไฟล์meta-ubuntu...tar.xzและubuntu...tar.xzซึ่งสามารถนำเข้าได้ (บนเซิร์ฟเวอร์อื่น) ด้วย

lxc image import meta...tar.xz rootfs ubuntu...tar.xz --alias imported_ubuntu

ฉันจะคัดลอกคอนเทนเนอร์ระหว่างโฮสต์ได้อย่างไร

ขอบคุณ!

แก้ไข: ฉันได้ตรวจสอบเพิ่มเติมและเผยแพร่คอนเทนเนอร์ทดสอบของฉันแล้ว ซึ่งสร้างรูปภาพของมัน จากนั้นฉันก็ได้ไฟล์ .gz (ไม่มีข้อมูลเมตา) เมื่อฉันส่งออก ถ้าฉันจี้ข้อมูลเมตาจากรูปภาพต้นฉบับ ฉันก็ไม่สามารถเริ่มคอนเทนเนอร์ได้ แม้ว่าการนำเข้าจะไม่ขัดข้องกับฉันอีกต่อไป --- เห็นได้ชัดว่าฉันไม่รู้ว่ากำลังทำอะไรอยู่ ดึงภาพมากกว่าที่จะเป็นเจ้าภาพครั้งที่สองโดยใช้ LXD เป็นระยะไกล:วิธีการ (หลังจากที่เพิ่มโฮสต์โดยใช้การตั้งค่า LXD) ที่ไม่ได้ผลในมันปรากฏในรายการภาพ LXC

answer

รุ่นที่ใหม่กว่า (ไม่ใช่เบต้า) ของ lxd (v2.0) ดูเหมือนว่าจะแก้ไขปัญหาของฉันได้แล้ว ขั้นตอนต่างๆ ที่อาจพบได้ในเอกสารที่ดีเยี่ยมที่นี่คือ:

  1. เผยแพร่รูปภาพ (โดยไม่หยุดคอนเทนเนอร์) บนโฮสต์ A;

    $ lxc publish --force container_name --alias image_name
    Container published with fingerprint: d2fd708361...a125d0d5885
    
  2. ส่งออกรูปภาพเป็นไฟล์

    $ lxc image export image_name 
    Output is in dd2fd708361...a125d0d5885.tar.gz
    
  3. คัดลอกไฟล์ไปยังโฮสต์ B และนำเข้า

    $ lxc image import dd2fd708361...a125d0d5885.tar.gz --alias image_name
    Transferring image: 100%
    
  4. เปิดคอนเทนเนอร์ (จากภาพ) บนโฮสต์ B;

    $ lxc launch image_name container_name
    Creating container_name
    Starting container_name
    

ในบางกรณีคำสั่งเผยแพร่อาจนำไปสู่การแยกน้ำมันดิน XZ ลูก --- แต่รูปแบบทั้งสองจะได้รับการสนับสนุน เพียงนำเข้าข้อมูลเมตาและส่วนประกอบ rootfs ด้วย

    lxc image import <metadata tarball> <rootfs tarball> --alias image_name

0_0 โพสต์คำตอบที่ดี แต่ฉันยังไม่ได้รับอนุญาตให้แสดงความคิดเห็น ดังนั้นฉันจะโพสต์คำตอบของเขาที่แก้ไข

ก่อนอื่นlxc publish --force container_name --alias image_nameจะหยุดคอนเทนเนอร์และเริ่มต้นใหม่ แต่ OP ไม่ต้องการให้คอนเทนเนอร์หยุดทำงาน

คุณควรสร้างสแนปชอตก่อนด้วย lxc snapshot container_name snapshot_name

จากนั้นคุณสามารถเผยแพร่ภาพด้วย lxc publish container_name/snapshot_name --alias image_name

ตอนนี้เพียงทำตามคำแนะนำที่เหลือของเขา

หากคุณมี socat หรือ netcat หรือ gcc / python / perl / อะไรก็ตามที่สามารถฟังบน tcp ได้ คุณยังสามารถฟังบนเซิร์ฟเวอร์ระดับกลางและส่งต่อการเชื่อมต่อกับโฮสต์อื่น