Docker - คอนเทนเนอร์ไม่ทำงาน


92

ฉันเป็นมือใหม่สำหรับนักเทียบท่า ฉันพยายามเริ่มคอนเทนเนอร์ที่ออกแล้วดังนี้

  1. ฉันแสดงรายการคอนเทนเนอร์ที่มีอยู่ทั้งหมดโดยใช้docker ps -aไฟล์. มีรายการดังต่อไปนี้:

    นักเทียบท่าแสดงรายการภาพทั้งหมด

  2. ฉันป้อนคำสั่งต่อไปนี้เพื่อเริ่มคอนเทนเนอร์ซึ่งอยู่ในขั้นตอนออกและเข้าไปในเทอร์มินัลของรูปภาพนั้น

    docker start 79b3fa70b51d
    docker exec -it 79b3fa70b51d /bin/sh
    
  3. กำลังส่งข้อผิดพลาดต่อไปนี้

    FATA[0000] Error response from daemon: Container 79b3fa70b51d is not running

docker start 79b3fa70b51dแต่เมื่อผมเริ่มต้นภาชนะที่ใช้ มันพ่น ID คอนเทนเนอร์เป็นเอาต์พุตซึ่งเป็นเรื่องปกติหากทุกอย่างทำงานได้ตามปกติ ฉันไม่แน่ใจว่าอะไรเป็นสาเหตุของข้อผิดพลาดนี้ ความคิดใด ๆ เกี่ยวกับสาเหตุและข้อเสนอแนะเกี่ยวกับเรื่องนี้จะเป็นประโยชน์อย่างมากสำหรับฉัน ขอบคุณล่วงหน้า.


7
สวัสดีคุณช่วยอธิบายวิธีแก้ปัญหานี้ได้ไหม ฉันกลัวว่าคำตอบด้านล่างจะไม่สมเหตุสมผล
JayPex

4
@ApexFred คอนเทนเนอร์ Docker ไม่เหมือน VM ออกแบบมาเพื่อเรียกใช้แอปพลิเคชัน เมื่อแอปพลิเคชันสิ้นสุดลงคอนเทนเนอร์ก็เช่นกัน ในกรณีนี้ผู้ใช้ได้ตั้งค่า "แอปพลิเคชัน" สำหรับคอนเทนเนอร์เป็นคำสั่ง "echo" เนื่องจากคำสั่ง "echo" ทำการ echo จากนั้นจึงยุติคอนเทนเนอร์จึงสิ้นสุดลงด้วยคำสั่ง ถ้าเขาเริ่มคอนเทนเนอร์อีกครั้งมันจะทำการสะท้อนและยกเลิกอีกครั้ง คำสั่ง EXEC ต้องการคอนเทนเนอร์ที่กำลังทำงานอยู่ เนื่องจากคอนเทนเนอร์สิ้นสุดลงจึงไม่สามารถใช้เพื่อรันคำสั่งเพิ่มเติมได้
duct_tape_coder

คำตอบ:


31

79b3fa70b51dดูเหมือนว่าคอนเทนเนอร์จะทำเพียงechoไฟล์.

นั่นหมายความว่ามันเริ่มต้นก้องแล้วออกทันที

docker execคำสั่งถัดไปจะไม่พบว่ามันทำงานเพื่อแนบตัวเองกับคอนเทนเนอร์นั้นและดำเนินการคำสั่งใด ๆ : มันสายเกินไป ออกจากคอนเทนเนอร์แล้ว

docker execคำสั่งรันคำสั่งใหม่ในภาชนะที่ทำงาน

คำสั่งที่เริ่มต้นโดยใช้docker execจะทำงานในขณะที่กระบวนการหลักของคอนเทนเนอร์ (PID 1) กำลังทำงานอยู่เท่านั้น


1
สวัสดี VonC ขอบคุณสำหรับความคิดเห็นของคุณ ฉันจะเข้าไปในเทอร์มินัลของรูปภาพได้อย่างไร?
Stranger

3
@Udhayakumar ง่ายๆdocker run -it --rm udhayakumar/busyboxwithtouchน่าจะเพียงพอสำหรับการเปิดเซสชั่น จุดเริ่มต้นควรเป็น / bin / sh แต่ขึ้นอยู่กับ Dockerfile ของคุณ: คุณอาจกำหนดจุดเข้าใช้งานที่แตกต่างกันและ / หรือ CMD อื่น
VonC

51
สวัสดีคุณช่วยอธิบายวิธีแก้ปัญหานี้ได้ไหม ฉันกลัวว่าคำตอบนี้จะไม่สมเหตุสมผล
JayPex

2
@Jawad ด้วยการเรียกใช้ busyboxwithtouch โดยไม่มีพารามิเตอร์ใด ๆ จะเป็นค่าเริ่มต้นของเชลล์แบบโต้ตอบ (ซึ่งจะไม่ออกทันที) ซึ่งหมายความว่าคุณสามารถdocker execแนบ( ) ในภายหลังได้
VonC

62

ตามค่าเริ่มต้นคอนเทนเนอร์นักเทียบท่าจะออกทันทีหากคุณไม่มีงานใด ๆ กำลังทำงานอยู่บนคอนเทนเนอร์

เพื่อให้คอนเทนเนอร์ทำงานในพื้นหลังให้พยายามรันด้วยอาร์กิวเมนต์--detach(หรือ-d)

ตัวอย่าง:

docker pull debian

docker run -t -d --name my_debian debian
e7672d54b0c2

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e7672d54b0c2        debian              "bash"              3 minutes ago       Up 3 minutes                            my_debian

#now you can execute command on the container
docker exec -it my_debian bash
root@e7672d54b0c2:/# 

นั่นน่าจะเป็นคำตอบที่ดี
ของฉัน

22

หากไม่สามารถเริ่มกระบวนการหลักได้อีกครั้ง (นานพอ) อาจมีความเป็นไปได้commitที่คอนเทนเนอร์ไปยังอิมเมจใหม่และเรียกใช้คอนเทนเนอร์ใหม่จากรูปภาพนี้ แม้ว่านี่จะไม่ใช่ขั้นตอนการปฏิบัติที่ดีที่สุดตามปกติแต่ฉันพบว่ามีประโยชน์มากในการดีบักสคริปต์ที่ล้มเหลวนาน ๆ ครั้ง

docker exec -it 6198ef53d943 bash
Error response from daemon: Container 6198ef53d9431a3f38e8b38d7869940f7fb803afac4a2d599812b8e42419c574 is not running

docker commit 6198ef53d943
sha256:ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

docker run -it ace7ca65e6e bash
root@72d38a8c787d:/#

ฉันได้ทำตามขั้นตอนเดียวกัน แต่คอนเทนเนอร์ที่สร้างขึ้นใหม่ไม่สามารถเข้าถึงได้จากเบราว์เซอร์ที่สามารถเข้าถึงได้ก่อนหน้านี้
Muhammad Muazzam

1
โปรดทราบว่าคำสั่งเรียกใช้bashกระบวนการในคอนเทนเนอร์ คุณอาจมีเว็บเซิร์ฟเวอร์ที่ใช้งานมาก่อนดังนั้นคุณจะต้องตรวจสอบว่าต้องใช้คำสั่งใดในการสำรองข้อมูลเซิร์ฟเวอร์
Matthias Kuhn

10

ก่อนอื่นเราต้องเริ่มคอนเทนเนอร์นักเทียบท่า

ankit@ankit-HP-Notebook:~$  sudo docker start 3a19b39ea021

                        3a19b39ea021

หลังจากนั้นตรวจสอบคอนเทนเนอร์นักเทียบท่า:

ankit@ankit-HP-Notebook:~$  sudo docker ps -a

 CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                   PORTS               NAMES

  3a19b39ea021        coreapps/ubuntu16.04:latest   "bash"              13 hours ago        
  Up 9 seconds                                 ubuntu1

  455b66057060        hello-world                   "/hello"            4 weeks ago         

Exited (0) 4 weeks ago                       vigorous_bardeen

จากนั้นดำเนินการโดยใช้คำสั่งด้านล่าง:

ankit@ankit-HP-Notebook:~$  sudo docker exec -it 3a19b39ea021 bash

root@3a19b39ea021:/# 

การเพิ่มข้อความที่ช่วยอธิบายคำตอบของคุณจะเป็นประโยชน์
Lauren Van Sloun

9

สิ่งนี้เกิดขึ้นกับอิมเมจที่สคริปต์ไม่เปิดใช้บริการที่รอการร้องขอดังนั้นคอนเทนเนอร์จะออกจากตอนท้ายของสคริปต์

โดยทั่วไปจะเป็นกรณีนี้กับอิมเมจระบบปฏิบัติการพื้นฐานส่วนใหญ่ (centos, debian ฯลฯ ) หรือกับอิมเมจของโหนด

ทางออกที่ดีที่สุดของคุณคือการใช้ภาพในโหมดโต้ตอบ ตัวอย่างด้านล่างพร้อมภาพโหนด :

docker run -it node /bin/bash

เอาต์พุตคือ

root@cacc7897a20c:/# echo $SHELL
/bin/bash

5

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน

รับ ID คอนเทนเนอร์และรีสตาร์ท

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


3

เหตุผลก็คือสิ่งที่คำตอบที่ยอมรับได้กล่าวไว้ ฉันเพิ่มข้อมูลเพิ่มเติมซึ่งอาจให้ความเข้าใจเพิ่มเติมเกี่ยวกับปัญหานี้

  1. สถานะของภาชนะรวมCreated, Running, Stopped, Exited, Deadและคนอื่น ๆ ที่ผมรู้
  2. เมื่อเราเรียกใช้docker createงาน Docker daemon จะสร้างคอนเทนเนอร์ที่มีสถานะเป็นCreated.
  3. เมื่อdocker start, นักเทียบท่าภูตจะเริ่มต้นคอนเทนเนอร์ที่มีอยู่ซึ่งสถานะของอาจจะเป็นหรือCreatedStopped
  4. เมื่อเราเรียกใช้docker runงาน Docker daemon จะเสร็จสิ้นในสองขั้นตอน: docker createและdocker start.
  5. เมื่อไหร่ที่docker stopเห็นได้ชัดว่า Docker daemon จะหยุดคอนเทนเนอร์ ดังนั้นคอนเทนเนอร์จะอยู่ในStoppedสถานะ
  6. มาเป็นสิ่งที่สำคัญที่สุดตู้คอนเทนเนอร์จริงจินตนาการว่าตัวเองมีกระบวนการที่ยาวนานอยู่ในนั้น เมื่อกระบวนการออกกระบวนการถือตู้คอนเทนเนอร์ก็จะออกเช่นกัน Exitedดังนั้นสถานะของคอนเทนเนอร์นี้จะเป็น

กระบวนการจะออกเมื่อใด กล่าวอีกนัยหนึ่งกระบวนการคืออะไรเราเริ่มต้นได้อย่างไร
คำตอบอยู่CMDใน dockerfile หรือcommandในนิพจน์ต่อไปนี้ซึ่งเป็นbashค่าเริ่มต้นในบางภาพเช่น ubutu: 18.04

docker run ubuntu:18.04 [command]

3

docker run -it <image_id> /bin/bash

เรียกใช้ในโหมดโต้ตอบที่ดำเนินการแล้วทุบตีเชลล์


1
ฉันคิดว่าการ-dตั้งค่าสถานะเป็นการพิมพ์ผิดที่นี่?

2

สำหรับใครก็ตามที่พยายามทำสิ่งที่คล้ายกันโดยใช้ Dockerfile ...

การทำงานในโหมดแยกออกจะไม่ช่วย คอนเทนเนอร์จะออกเสมอ (หยุดทำงาน) หากคำสั่งไม่ปิดกั้นนี่เป็นกรณีที่เกิดขึ้นกับ bash

ในกรณีนี้วิธีแก้ปัญหาจะเป็น: 1. ยอมรับรูปภาพที่เป็นผลลัพธ์: (container_name = ชื่อของคอนเทนเนอร์ที่คุณต้องการวางฐานรูปภาพจาก image_name = ชื่อของรูปภาพที่จะสร้างนักเทียบท่ากระทำ container_name image_name 2. ใช้ นักเทียบท่าทำงานเพื่อสร้างคอนเทนเนอร์ใหม่โดยใช้อิมเมจใหม่โดยระบุคำสั่งที่คุณต้องการเรียกใช้ที่นี่ฉันจะเรียกใช้ "bash": docker run -it image_name bash

สิ่งนี้จะทำให้คุณได้รับการเข้าสู่ระบบแบบโต้ตอบที่คุณกำลังมองหา


1

นี่เป็นวิธีแก้ปัญหาเมื่อคอนเทนเนอร์นักเทียบท่าออกจากปกติและคุณสามารถแก้ไข Dockerfile ได้

โดยทั่วไปเมื่อมีการเรียกใช้คอนเทนเนอร์นักเทียบท่าแอปพลิเคชันจะถูกให้บริการโดยการรันคำสั่ง จากการอ้างอิง Dockerfile ,

คำสั่งทั้ง CMD และ ENTRYPOINT กำหนดคำสั่งที่จะเรียกใช้เมื่อเรียกใช้คอนเทนเนอร์ ... Dockerfile ควรระบุคำสั่ง CMD หรือ ENTRYPOINT อย่างน้อยหนึ่งคำสั่ง

เมื่อคุณสร้างรูปภาพและไม่ได้ระบุคำสั่งใด ๆ ด้วย CMD หรือ ENTRYPOINT คำสั่ง CMD หรือ ENTRYPOINT ของอิมเมจพื้นฐานจะถูกเรียกใช้

ตัวอย่างเช่น Ubuntu Dockerfile อย่างเป็นทางการมีCMD ["/bin/bash"]( https://hub.docker.com/_/ubuntu ) ตอนนี้bin/bash/คำสั่งสามารถยอมรับอินพุตและdocker run -it IMAGE_IDคำสั่งแนบ STDIN กับคอนเทนเนอร์ ผลลัพธ์คือคุณได้รับเทอร์มินัลแบบโต้ตอบและคอนเทนเนอร์ยังคงทำงานต่อไป

เมื่อมีการระบุคำสั่งที่มี CMD หรือ ENTRYPOINT ใน Dockerfile คำสั่งนี้จะถูกดำเนินการเมื่อเรียกใช้คอนเทนเนอร์ ตอนนี้ถ้าคำสั่งนี้สามารถจบได้โดยไม่ต้องป้อนข้อมูลใด ๆ คำสั่งจะเสร็จสิ้นและคอนเทนเนอร์จะออก docker run -it IMAGE_IDจะไม่จัดเตรียมเทอร์มินัลแบบโต้ตอบในกรณีนี้ ตัวอย่างจะเป็นภาพนักเทียบท่าที่สร้างจาก Dockerfile ด้านล่าง -

FROM ubuntu
ENTRYPOINT echo hello 

หากคุณต้องการไปที่เทอร์มินัลของรูปภาพนี้คุณจะต้องให้คอนเทนเนอร์ทำงานต่อไปโดยแก้ไขคำสั่งจุดเข้าใช้งาน

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

หลังจากเรียกใช้คอนเทนเนอร์ตามปกติdocker run IMAGE_IDแล้วคุณสามารถไปที่เทอร์มินัลอื่นและใช้docker exec -it CONTAINER_ID bashเพื่อรับเทอร์มินัลของคอนเทนเนอร์


"และคุณสามารถแก้ไข Dockerfile": ประเด็นสำคัญที่นี่ โหวตแล้ว
VonC

0

ในกรณีของฉันฉันเปลี่ยนชื่อไฟล์และชื่อไดเร็กทอรีบางอย่างของไดเร็กทอรีหลักของ Dockerfile เนื่องจากคอนเทนเนอร์ใดไม่พบพารามิเตอร์ที่ต้องการเพื่อเริ่มต้นอีกครั้ง

หลังจากเปลี่ยนชื่อกลับเป็นชื่อเดิมภาชนะก็เริ่มเหมือนเนย


0

ฉันมีสิ่งที่แตกต่างออกไป ฉันสามารถทำได้docker psและเห็นว่ามีคอนเทนเนอร์นักเทียบท่าทำงานอยู่ฉันพยายามรีสตาร์ทด้วยซ้ำ แต่ทันทีที่ฉันพยายามรับเซสชันด้วยNew-PSSession -ContainerId $containerId -RunAsAdministratorมันจะผิดพลาดโดยพูดว่า:

## [error] New-PSSession: ไม่มี ContainerId xxx อินพุต ## [ข้อผิดพลาด] หรือคอนเทนเนอร์ที่เกี่ยวข้องไม่ทำงาน

ปัญหาของฉันคือฉันใช้บริการเครือข่ายและไม่มีสิทธิ์เพียงพอที่จะดูคอนเทนเนอร์แม้ว่าฉันจะให้สิทธิ์ในการเรียกใช้คำสั่งนักเทียบท่า (ด้วยการกำหนดค่ากลุ่มความปลอดภัยของนักเทียบท่า)

ฉันไม่รู้วิธีเปิดใช้งานการทำงานกับคอนเทนเนอร์ดังนั้นฉันจึงต้องเปลี่ยนกลับไปใช้งานในฐานะผู้ดูแลระบบแทน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.