“ ไม่ได้ระบุคำสั่ง” จากอิมเมจ / คอนเทนเนอร์ของนักเทียบท่าที่นำเข้าใหม่


16

ฉันพยายามที่จะนำนักเทียบท่าจากเครื่องหนึ่งไปใช้อีกเครื่องหนึ่งและพบกับข้อผิดพลาดนี้: " การตอบสนองข้อผิดพลาดจาก daemon: ไม่ได้ระบุคำสั่ง "

ด้านล่างเป็นตัวอย่างแบบง่าย ๆ ที่แสดงปัญหา:

docker --version
Docker version 1.10.1, build 9e83765
docker pull ubuntu
docker run --name u1 -dit ubuntu:latest
docker export -o exported u1
docker stop u1
docker rm u1
docker import exported ubuntu:imported
docker run --name u1 -dit ubuntu:imported
docker: Error response from daemon: No command specified.

ในตัวอย่างนั้นเราจะดึงรูปภาพ (อูบุนตู) และสร้าง / เรียกใช้คอนเทนเนอร์สำเร็จu1จากนั้น จากนั้นเราส่งออกคอนเทนเนอร์นั้นไปยังไฟล์ ( exported) หยุด / ลบคอนเทนเนอร์นำเข้าไฟล์ไปยังรูปภาพใหม่ ( ubuntu:imported) และลองเรียกใช้คอนเทนเนอร์ใหม่จากมัน มันล้มเหลว

คำตอบ:


18

docker exportไม่ได้ส่งออกทุกอย่างเกี่ยวกับคอนเทนเนอร์ - เพียงแค่ระบบไฟล์ ดังนั้นเมื่ออิมพอร์ตดัมพ์กลับไปยังอิมเมจ docker ใหม่จำเป็นต้องระบุแฟล็กเพิ่มเติมเพื่อสร้างบริบทอีกครั้ง

ตัวอย่างเช่นหากคอนเทนเนอร์เดิมทำงานได้ดีเนื่องจาก Dockerfile ที่ใช้สำหรับสร้างภาพมีCMD ["/usr/bin/supervisord"]อยู่ในนั้นให้นำเข้าดัมพ์ของคุณด้วยวิธีนี้:

docker import \
--change 'CMD ["/usr/bin/supervisord"]' \
path/to/dump.tar imagename:tagname

2
คุณสามารถรันการdocker inspect imagename:tagnameเปรียบเทียบต้นฉบับกับที่นำเข้า ฉันมีโชคไม่มีimport/ exportและ--changeแม้ว่าทุกอย่างทำงานได้ดีกับ/save load
earcam

2

microsoft/mssql-server-linuxมีข้อผิดพลาดนี้เมื่อพยายามที่จะส่งออกและนำเข้านักเทียบท่า

https://hub.docker.com/r/microsoft/mssql-server-linux/

คำสั่งเพื่อส่งออกและนำเข้า:

docker export --output "C:\Users\oscar\Desktop\sqlTestMS.tar" msSQL

docker import "C:\Users\oscar\Desktop\sqlTestMS.tar" mssql

อย่างไรก็ตามเราไม่พบคำสั่งให้เรียกใช้ วิธีแก้ไขคือการแสดงรายการคอนเทนเนอร์ทั้งหมดบนเครื่องส่งออกและดูคำสั่งที่รัน

docker ps

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นเราสามารถหาวิธีเรียกใช้คำสั่งที่ถูกต้อง:

docker run --name msSQL -p 1401:1433 -d mssql:latest /opt/mssql/bin/sqlservr

1

เมื่อคุณส่งออกคอนเทนเนอร์มันจะสูญเสียประวัติของตัวเองซึ่งมีเลเยอร์รูปภาพและข้อมูลเมตา ดังนั้นคอนเทนเนอร์ของคุณสูญเสียสถานะ pid

ภาชนะทุกอันควรมีกระบวนการเริ่มต้น (รูท) คุณกำลังแทนที่จุดเริ่มต้นบน dockerfile เป็นทุบตี [แก้ไข] ฉันคิดว่าแม้คุณจะไม่แทนที่มันใช้ค่าเริ่มต้นไม่ได้กำหนดในภาพฐานอูบุนตู ดังนั้นคุณควรเริ่มกระบวนการเริ่มต้นด้วยคำสั่ง cmd ฉันคิดว่าไม่มีข้อผิดพลาด มันเป็นคุณสมบัติ dockerfile สำหรับ reusablity


ฉันกำลังเอาชนะจุดเข้าใช้งานในการแก้ไขปัญหาเฉพาะหน้าเท่านั้น ไม่มีสิ่งใดถูกเขียนทับในระหว่างการส่งออก / นำเข้า
Greendrake

สวัสดี @ DrakeES คำตอบของฉันเพิ่งได้รับการปรับปรุง ฉันอธิบายสิ่งที่เกิดขึ้นเมื่อคุณส่งออกคอนเทนเนอร์
pmoksuz

0

ให้มันทำงานกับขั้นตอนเพิ่มเติมเหล่านี้:

  1. สร้าง Dockerfile ดังต่อไปนี้:

    FROM ubuntu:imported
    ENTRYPOINT bash
    
  2. สร้างภาพใหม่:

    docker build -t ubuntu:importedwithdockerfile .
    
  3. ตอนนี้มันจะทำงาน:

    docker run --name u1 -dit ubuntu:importedwithdockerfile
    

อย่างไรก็ตามมันยังไม่ชัดเจนว่าทำไมเพียงแค่ส่งออกแล้วนำเข้าภาพไม่ทำงานทันที นี่เป็นข้อบกพร่องหรือไม่?


-1

คุณสามารถใช้docker loadคำสั่งเพื่อโหลดรูปภาพจากไฟล์เก็บถาวร คำสั่งนี้จะนำเข้าไฟล์รูปภาพและเข้าด้วยกัน


1
ไฟล์ "เก็บถาวร" ในกรณีนี้คืออะไรและจะสร้างได้อย่างไร
Greendrake

2
@Greendrake docker loadและdocker saveดำเนินการกับภาพภาชนะ (ซึ่งจะถูกสร้างภาชนะ) ในขณะที่docker importและdocker exportทำงานบนภาชนะ
Michael Hampton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.