วิธีการต่อคอนเทนเนอร์ Docker ที่ออก


263

พิจารณา:

docker run -it centos /bin/bash

ฉันกดCtrl+ Dเพื่อออก

ฉันต้องการเรียกใช้คอนเทนเนอร์นี้ต่อ แต่ฉันพบว่าฉันทำไม่ได้

วิธีเดียวคือ

docker commit `docker ps -q -l` my_image
docker run -it my_image /bin/bash

ฉันถูกไหม? มีวิธีที่ดีกว่านี้ไหม? (ฉันใช้นักเทียบท่า 0.8.0)


1
คุณพยายามกำหนดชื่อให้กับคอนเทนเนอร์แล้วใช้ชื่อนั้นในการควบคุมหรือไม่? โดยวิธีการ "ออกมัน" คุณหมายถึงแยกออกจากมันใช่มั้ย
Eric Platon

12
นักเทียบท่าเป็นเครื่องมือสำหรับการเขียนโปรแกรมอย่างน้อยนั่นเป็นวิธีที่ฉันใช้ หากคนส่วนใหญ่ไม่เห็นด้วยคนควรบอก Docker ว่าอย่าชี้ไปที่ StackOverflow เป็นสถานที่ถามคำถาม ฉันแน่ใจว่านี่ไม่ใช่คำถามแรก "DevOps" ที่สามารถไปได้ทั้งที่นี่หรือ SuperUser
Ted M. Young

5
นักเทียบท่าเป็นเครื่องมือสำหรับนักพัฒนา มันเป็นแท็ก 'นักเทียบท่า' อยู่ที่นี่แล้ว ดังนั้นฉันคิดว่าเหมาะสมที่จะถามใน stackoverflow ฉันใช้มันเพื่อสร้างภาพที่ต้องสร้างจากสภาพแวดล้อมที่สะอาด
Daniel YC Lin

6
ฉันหวังว่าคนที่ติดแท็กสิ่งนี้เป็น "นอกหัวข้อ" จะอธิบายว่าทำไม!
jpetazzo

2
เพื่อสนับสนุนคำถามนี้จะไม่ถูกปิดหัวข้อ: meta.stackoverflow.com/q/276579/210336และmeta.stackoverflow.com/q/271279/210336
Matthijs Wessels

คำตอบ:


291

คุณสามารถรีสตาร์ทคอนเทนเนอร์ที่มีอยู่หลังจากออกจากและการเปลี่ยนแปลงของคุณยังคงอยู่ที่นั่น

docker start  `docker ps -q -l` # restart it in the background
docker attach `docker ps -q -l` # reattach the terminal & stdin

3
เพื่อสรุปเป็นหนึ่งบรรทัด: docker start `docker ps -q -l` && docker attach `docker ps -q -l`
Daniel YC Lin

7
docker start -i $(docker ps -q -l)เพื่อสรุปเป็นหนึ่งบรรทัด: ;-) การตั้งชื่อสามารถช่วยควบคุมคอนเทนเนอร์ที่เลือกไว้ได้ดีขึ้น -lได้ครั้งสุดท้ายตกลง ...
Eric Platon

103
สำหรับผู้ที่ยังใหม่กับ Linux `docker ps -q -l`บิตคือการขยายตัว มันจะถูกแทนที่ด้วยรหัสของภาชนะนักเทียบท่า (-l) ล่าสุดที่สร้างขึ้น -q เพียงยับยั้งข้อมูลอื่น ๆ (bedsides ประชาชนได้) `docker ps`มักจะเอาท์พุท ---- หมายเหตุ: Backtick ไม่ได้เป็นเครื่องหมายคำพูด แต่ก็มีความหมายพิเศษมาก ทุกสิ่งที่คุณพิมพ์ระหว่าง backticks จะถูกประเมิน (ดำเนินการ) โดยเชลล์ก่อนคำสั่งหลัก - unix.stackexchange.com/questions/27428/…
bnieland

1
ฉันได้พบภาชนะที่ได้รับอยู่ในสภาพที่เรียกว่าจากที่ที่มันไม่สามารถเริ่มต้นด้วยCreated... docker start ...อย่างไรก็ตามสามารถเริ่มต้นใหม่ได้โดยใช้docker restart ...
Voltaire

2
หมายเหตุ: -lรับเฉพาะนักเทียบท่า "ล่าสุด" หากคุณชอบฉันและdocker ps -aแสดงให้เห็นว่ามากกว่าหนึ่งสิ่งที่คุณต้องการที่จะเริ่มต้นขึ้นแล้วคุณสามารถเริ่มต้นใหม่ "ทั้งหมด" (-a) docker start `docker ps -q -a`ของพวกเขาโดยการเปลี่ยนคำสั่งข้างต้น -qเพียงแค่ทำให้มัน "เงียบ" (ไม่ใช่การบันทึกผลลัพธ์)
Rock Lee

148
docker start -a -i `docker ps -q -l`

คำอธิบาย:

docker startเริ่มต้นคอนเทนเนอร์ (ต้องมีชื่อหรือ ID)
-aแนบกับ
-iโหมดโต้ตอบ
docker psรายการคอนเทนเนอร์รายการคอนเทนเนอร์
-qเท่านั้นรายการคอนเทนเนอร์ ID
-lเท่านั้นคอนเทนเนอร์ที่สร้างล่าสุด


นักเทียบท่า ps -q -l มันจะให้ ID คอนเทนเนอร์ของที่สร้างขึ้นล่าสุดแม้ว่ามันจะอยู่ในสถานะเริ่มต้น
Dharmang

สิ่งที่เรียกว่า "แนบ" กับภาชนะบรรจุคืออะไร? "แนบ"?
skytree

49

ใช้:

docker start $(docker ps -a -q --filter "status=exited")

สิ่งนี้จะเริ่มต้นคอนเทนเนอร์ทั้งหมดที่อยู่ในสถานะออกจาก

docker exec -it <container-id> /bin/bash

สิ่งนี้จะเชื่อมต่อกับคอนเทนเนอร์เฉพาะ


2
ฉันพบว่านี่เป็นสิ่งเดียวที่ทำงานได้สำหรับฉัน .. เนื่องจากบรรทัดที่สองที่สำคัญ docker exec -it <container id> /bin/bash(หรือเพียงแค่ทุบตี)
barlop

มันใช้งานได้สำหรับฉัน แต่ฉันต้องวิ่งให้มันสองครั้งตั้งแต่ฉันมีตู้คอนเทนเนอร์สองตู้ ดังนั้นหากคนแรกเริ่มและคนที่สองได้รับข้อผิดพลาด เพียงกดคำสั่งเดียวกันอีกครั้งและควรเริ่มต้นคอนเทนเนอร์ถัดไป
Andrija J Fourkidney

20

หากคุณต้องการที่จะทำมันในหลายคำสั่งที่ง่ายต่อการจำ:

  1. รายการหยุดภาชนะบรรจุ:

docker ps -a

  1. คัดลอกชื่อหรือรหัสภาชนะของภาชนะที่คุณต้องการแนบและเริ่มภาชนะด้วย:

docker start -i <name/id>

-iธงบอกนักเทียบท่าที่จะแนบไป stdin คอนเทนเนอร์

หากคอนเทนเนอร์ไม่ได้เริ่มต้นด้วยเชลล์แบบโต้ตอบเพื่อเชื่อมต่อคุณต้องทำสิ่งนี้เพื่อเรียกใช้เชลล์:

docker start <name/id>
docker exec -it <name/id> /bin/sh

/bin/shเป็นเปลือกมักจะมาพร้อมกับภาพที่อัลไพน์ตาม


คำตอบที่ถูกประเมินต่ำกว่านี้ช่วยฉันค้นหาคอนเทนเนอร์ที่ฉันค้นหาได้ง่ายกว่า "คำตอบ" สำหรับคำถามนี้
นิโคลัส labrecque

3
Error response from daemon: Container <id> is not running
Cerin

14

หากคุณต้องการทำต่อ Docker หนึ่งตัวต่อด้วยชื่อที่รู้จัก:

docker start  `docker ps -a -q --filter "name=elas"`

1
ขอบคุณ @Nelson สิ่งนี้มีประโยชน์มากสำหรับฉันในการเริ่มนักเทียบท่าโดยเฉพาะ
SCHIN CHAVAN

ในกรณีนี้คุณสามารถเรียกใช้docker start <name>โดยที่ <name> เป็นชื่อของคอนเทนเนอร์ของคุณ อย่างน้อยกับนักเทียบท่า v19.03.8
Don Foumare

13

ทำตามขั้นตอนเหล่านี้:

  1. เรียกใช้คำสั่งด้านล่างเพื่อดูว่าบริการคอนเทนเนอร์ทั้งหมดทำงานและหยุดทำงาน ตัวเลือก-aจะได้รับเพื่อดูว่าภาชนะหยุดเช่นกัน

    docker ps -a
    
  2. จากนั้นเริ่มคอนเทนเนอร์นักเทียบท่าด้วยcontainer_idชื่อแท็กคอนเทนเนอร์หรือ

    docker start <CONTAINER_ID> or <NAMES>
    

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

    พูดจากภาพด้านบนรหัสคอนเทนเนอร์ 4b161b302337
    ดังนั้นคำสั่งที่จะเรียกใช้คือ

    docker start 4b161b302337
    
  3. หนึ่งสามารถตรวจสอบว่าภาชนะกำลังทำงานกับ

    docker ps
    

9

หากคุณมีชื่อคอนเทนเนอร์แล้วมันสามารถเริ่มต้นได้โดยการเรียกใช้

docker container start container_name

โดยที่container_nameเป็นชื่อของคอนเทนเนอร์ที่ต้องกำหนดในเวลาที่สร้างคอนเทนเนอร์ คุณสามารถแทนที่container_nameด้วย ID คอนเทนเนอร์ในกรณีที่ไม่มีชื่อคอนเทนเนอร์ สามารถพบ ID คอนเทนเนอร์ได้โดยเรียกใช้:

docker ps -a

5

คำสั่งเหล่านี้จะใช้งานได้กับคอนเทนเนอร์ใด ๆ (ไม่เพียง แต่ออกจากครั้งล่าสุด) วิธีนี้จะใช้ได้แม้หลังจากที่ระบบของคุณรีบูทแล้ว หากต้องการทำเช่นนั้นคำสั่งเหล่านี้จะใช้ "container id"

ขั้นตอน:

  1. แสดงรายการตัวเทียบท่าทั้งหมดโดยใช้คำสั่งนี้และจดบันทึก ID คอนเทนเนอร์ของคอนเทนเนอร์ที่คุณต้องการรีสตาร์ท: docker ps -a

  2. เริ่มคอนเทนเนอร์ของคุณโดยใช้ ID คอนเทนเนอร์: docker start <container_id>

  3. แนบและเรียกใช้คอนเทนเนอร์ของคุณ: docker attach <container_id>

หมายเหตุ: ทำงานบน linux


1

โดยชื่อ

sudo docker start bob_the_container

หรือโดยรหัส

sudo docker start aa3f365f0f4e

สิ่งนี้รีสตาร์ทหยุดคอนเทนเนอร์ใช้ -i เพื่อแนบ STDIN ของคอนเทนเนอร์หรือแทน -i คุณสามารถแนบกับเซสชันคอนเทนเนอร์ (ถ้าคุณเรียกใช้ด้วย -it)

sudo docker attach bob_the_container

0
docker start `docker ps -a | awk '{print $1}'`

สิ่งนี้จะเริ่มต้นคอนเทนเนอร์ทั้งหมดที่อยู่ในสถานะ 'Exited'

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