การหยุดคอนเทนเนอร์ Docker ด้วยชื่อรูปภาพ - Ubuntu


156

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

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

คำตอบ:


211

ปัญหาต่อไปนี้ 8959การเริ่มต้นที่ดีคือ:

docker ps -a -q --filter="name=<containerName>"

ตั้งแต่nameหมายถึงภาชนะและไม่ใช่ชื่อภาพคุณจะต้องใช้เมื่อเร็ว ๆ นี้บรรพบุรุษหาง 1.9 กรอง , กล่าวถึงในkoekiebox 's คำตอบ

docker ps -a -q  --filter ancestor=<image-name>

ตามความเห็นด้านล่างโดยkirilเพื่อลบภาชนะเหล่านั้น:

stop ส่งคืนคอนเทนเนอร์เช่นกัน

ดังนั้นการผูกมัดstopและrmจะทำงาน:

docker rm $(docker stop $(docker ps -a -q --filter ancestor=<image-name> --format="{{.ID}}"))

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

@kiril ps -aภาชนะหยุดจะถูกส่งกลับโดย ลบคอนเทนเนอร์แล้ว ... พวกมันถูกลบไปแล้วมันไม่มีอยู่อีกต่อไป
VonC

1
ขอบคุณฉันไม่ได้ตระหนักถึงการหยุดส่งคืนคอนเทนเนอร์เช่นกัน ดังนั้นการหยุดการผูกมัดและ rm จะทำงาน: นักเทียบท่า rm $ (นักจอดหยุด $ (นักเทียบท่า ps -a -q --filter = "name = <imageName>"))
kiril

@kiril นั่นคือความคิดใช่
VonC

63

คำตอบก่อนหน้านี้ไม่ได้ผลสำหรับฉัน แต่สิ่งนี้ทำได้:

docker stop $(docker ps -q --filter ancestor=<image-name> )

1
การใช้บรรพบุรุษที่น่าสนใจที่นั่น ( docs.docker.com/engine/reference/commandline/ps/#filtering ) +1
VonC

1
ทำงานบน Docker Terminal สำหรับ Windows เช่นกัน
Koekiebox

44

คุณสามารถเริ่มต้นคอนเทนเนอร์ได้โดยตั้งชื่อคอนเทนเนอร์:

docker run -d --name <container-name> <image-name>

สามารถใช้อิมเมจเดียวกันในการหมุนหลายคอนเทนเนอร์ดังนั้นนี่เป็นวิธีที่ดีในการเริ่มต้นคอนเทนเนอร์ จากนั้นคุณสามารถใช้ชื่อคอนเทนเนอร์นี้เพื่อหยุดแนบ ... คอนเทนเนอร์:

docker exec -it <container-name> bash
docker stop <container-name>
docker rm <container-name>

ฉันชอบวิธีนี้มาก มีวิธีที่ดีกว่าในการสร้างหยุด / ลบแล้วเรียกใช้คอนเทนเนอร์มากกว่านี้หรือไม่? sudo docker build . -t <img-name> && sudo docker stop <container-name> || true && sudo docker run -d --rm --name <container-name> <img-name>
melanke

16

รหัสนี้จะหยุดทุกภาชนะที่มีภาพCentOS: 6 ฉันไม่พบวิธีแก้ปัญหาที่ง่ายกว่าสำหรับเรื่องนี้

docker ps | grep centos:6 | awk '{print $1}' | xargs docker stop

หรือสั้นกว่า:

docker stop $(docker ps -a | grep centos:6 | awk '{print $1}')

1
ต้องการการปรับปรุง :::: หยุดนักเทียบท่า $ (นักเทียบท่า ps -a | grep centos: 6 | awk '{พิมพ์ $ 1}')
Shailesh kumar

@Shaileshkumar เพิ่มรุ่นของคุณ =)
ArgonQQ

9

สองวิธีในการหยุดเรียกใช้คอนเทนเนอร์:

1. $docker stop container_ID

2. $docker kill container_ID

คุณสามารถเรียกใช้คอนเทนเนอร์โดยใช้คำสั่งต่อไปนี้:

$docker ps

ลิงค์ต่อไปนี้สำหรับข้อมูลเพิ่มเติม:


ลิงก์สุดท้ายใช้งานไม่ได้ ( "ขออภัยเราไม่พบหน้านั้น" )
ปีเตอร์มอร์เทนเซ่น

มันเป็นตัวอักษร$docker? หรือว่า$มาจาก shell prompt?
ปีเตอร์มอร์เทนเซ่น

2

สำหรับ Docker รุ่น 18.09.0 ฉันพบว่าไม่จำเป็นต้องตั้งค่าสถานะรูปแบบ

docker rm $(docker stop $(docker ps -a -q -f ancestor=<image-name>))

2

หยุดนักเทียบท่าคอนเทนเนอร์ด้วยชื่อรูปภาพ:

imagename='mydockerimage'
docker stop $(docker ps | awk '{split($2,image,":"); print $1, image[1]}' | awk -v image=$imagename '$2 == image {print $1}')

หยุดนักเทียบท่าคอนเทนเนอร์ด้วยชื่อภาพและแท็ก:

imagename='mydockerimage:latest'
docker stop $(docker ps | awk -v image=$imagename '$2 == image {print $1}')

หากคุณสร้างภาพคุณสามารถเพิ่มป้ายกำกับนั้นและกรองการเรียกใช้คอนเทนเนอร์ตามป้ายกำกับ

docker ps -q --filter "label=image=$image"

วิธีการที่ไม่น่าเชื่อถือ

docker ps -a -q  --filter ancestor=<image-name>

ไม่ได้ผลเสมอไป

docker ps -a -q --filter="name=<containerName>"

กรองตามชื่อคอนเทนเนอร์ไม่ใช่ชื่อรูปภาพ

docker ps | grep <image-name> | awk '{print $1}'

มีปัญหาเนื่องจากชื่อภาพอาจปรากฏในคอลัมน์อื่นสำหรับภาพอื่น ๆ


1

ฉันทำ a /usr/local/bin/docker.stopที่ใช้ในชื่อรูปภาพ (สมมติว่าคุณมีเพียงหนึ่งการทำงาน)

docker stop $(docker ps -q -f "name=$1")

1

ฉันพยายามห่อคำสั่ง Docker ของฉันในงานอึกและรู้ว่าคุณสามารถทำสิ่งต่อไปนี้:

docker stop container-name
docker rm container-name

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


1

ในกรณีของฉัน--filter ancestor=<image-name>ไม่ทำงานดังนั้นคำสั่งต่อไปนี้จึงทำความสะอาดคอนเทนเนอร์ Docker ให้ฉัน:

docker rm $(docker stop $(docker ps -a -q --filter "name=container_name_here" --format="{{.ID}}"))


1

การเพิ่มคำตอบที่ยอดเยี่ยมของ @VonC นี่คือฟังก์ชัน ZSH ที่คุณสามารถเพิ่มลงในไฟล์. zshrc ของคุณ:

dockstop() {
  docker rm $(docker stop $(docker ps -a -q --filter ancestor="$1" --format="{{.ID}}"))
}

จากนั้นในบรรทัดคำสั่งของคุณเพียงแค่ทำdockstop myImageNameและมันจะหยุดและลบภาชนะทั้งหมดที่เริ่มต้นจากภาพที่เรียกว่า myImageName



0

ใช้: หยุดนักเทียบท่าคอนเทนเนอร์ $ (นักเทียบท่าคอนเทนเนอร์ ls -q - ตัวกรองบรรพบุรุษ = mongo)

    (base) :~ user$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
    d394144acf3a        mongo               "docker-entrypoint.s…"   15 seconds ago      Up 14 seconds       0.0.0.0:27017->27017/tcp   magical_nobel
    (base) :~ user$ docker container stop $(docker container ls -q --filter ancestor=mongo)
    d394144acf3a
    (base) :~ user$ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    (base) :~ user$

0

หากคุณต้องการAWKวิธีง่าย ๆนี่คือการเรียนของฉัน:

docker rm -f $(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}')

$(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}') - พิมพ์ชื่อคอนเทนเนอร์นักเทียบท่าตามภาพอินพุต

docker ps - แสดงรายการตู้สินค้าทั้งหมด

awk '{ if($2 == "<your-image-name>") { print $NF}}'- คอลัมน์ที่สองแยกวิเคราะห์ของdocker psให้ชื่อภาพ เปรียบเทียบกับชื่อภาพของคุณจะดำเนินการprint $NFที่พิมพ์ชื่อคอนเทนเนอร์

docker rm -f เอาภาชนะบรรจุออก

ตัวอย่างเช่นการลบคอนเทนเนอร์ที่ใช้งานอยู่ทั้งหมดของภาพอูบุนตูสามารถทำได้ง่ายๆเพียงแค่:

docker rm -f $(docker ps | awk '{ if($2 == "ubuntu:latest") { print $NF}}')

PS: อย่าลืมใส่แท็กภาพใน AWK เนื่องจากเป็นตัวเปรียบเทียบที่เท่ากัน


-5

คุณสามารถใช้psคำสั่งเพื่อดูคอนเทนเนอร์ที่รันอยู่:

docker ps -a

จากที่นั่นคุณควรเห็นชื่อของคอนเทนเนอร์พร้อมกับ ID คอนเทนเนอร์ที่คุณกำลังมองหา ต่อไปนี้เป็นข้อมูลเพิ่มเติมเกี่ยวกับdocker ps


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