Dừng các container Docker theo tên hình ảnh - Ubuntu


155

Trên Ubuntu 14.04 (Trusty Tahr) Tôi đang tìm cách ngăn chặn một container đang chạy và thông tin duy nhất tôi có là tên hình ảnh được sử dụng trong lệnh chạy Docker.

Có một lệnh để tìm tất cả các container đang chạy phù hợp với tên hình ảnh đó và dừng chúng không?

Câu trả lời:


210

Sau vấn đề 8959 , một khởi đầu tốt sẽ là:

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

nameđề cập đến vùng chứa chứ không phải tên hình ảnh, bạn sẽ cần sử dụng tổ tiên bộ lọc Docker 1.9 gần đây hơn , được đề cập trong câu trả lời của koekiebox .

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

Như bình luận dưới đây của kiril , để loại bỏ các container đó:

stop trả lại các container là tốt.

Vì vậy, xích stoprmsẽ làm công việc:

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

Điều đó thật tuyệt. Vấn đề của tôi sau đó là khi loại bỏ các container, vì chúng bị bỏ sót, chúng không được trả về bởi docker pd. Bất kỳ manh mối làm thế nào để làm điều đó?
kiril

@kiril dừng container được trả lại bởi ps -a. Các container bị xóa ... chúng cũng bị xóa, chúng không còn tồn tại nữa.
VonC

1
Cảm ơn, tôi đã không nhận ra dừng trả lại các container là tốt. Vì vậy, chuỗi dừng và rm sẽ thực hiện công việc: docker rm $ (docker stop $ (docker ps -a -q --filter = "name = <imageName>"))
kiril

@kiril Đó là ý tưởng, vâng.
VonC


44

Bạn có thể bắt đầu bộ chứa một tên container:

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

Cùng một hình ảnh có thể được sử dụng để quay nhiều container, vì vậy đây là một cách tốt để bắt đầu một container. Sau đó, bạn có thể sử dụng tên container này để dừng, đính kèm ... container:

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

Tôi thực sự thích giải pháp này. Có cách nào tốt hơn để xây dựng, dừng / loại bỏ và sau đó chạy một container hơn thế này không? sudo docker build . -t <img-name> && sudo docker stop <container-name> || true && sudo docker run -d --rm --name <container-name> <img-name>
melanke

16

Mã này sẽ dừng tất cả các container với centos hình ảnh : 6 . Tôi không thể tìm thấy một giải pháp dễ dàng hơn cho điều đó.

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

Hoặc thậm chí ngắn hơn:

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

1
cần cải thiện :::: docker dừng $ (docker ps -a | grep centos: 6 | awk '{print $ 1}')
Shailesh kumar

@Shaileshkumar Đã thêm phiên bản của bạn =)
ArgonQQ

9

Hai cách để ngừng chạy một container:

1. $docker stop container_ID

2. $docker kill container_ID

Bạn có thể nhận được các container đang chạy bằng lệnh sau:

$docker ps

Các liên kết sau để biết thêm thông tin:


Liên kết cuối cùng bị hỏng ( "Xin lỗi, chúng tôi không thể tìm thấy trang đó" ).
Peter Mortensen

Có phải theo nghĩa đen $docker? Hoặc là $từ dấu nhắc shell?
Peter Mortensen

2

Đối với Docker phiên bản 18.09.0 tôi thấy rằng cờ định dạng sẽ không cần thiết

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

2

Dừng container docker theo tên hình ảnh:

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

Dừng docker container theo tên hình ảnh và thẻ:

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

Nếu bạn đã tạo hình ảnh, bạn có thể thêm nhãn vào nó và lọc các container đang chạy theo nhãn

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

Phương pháp không đáng tin cậy

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

không phải lúc nào cũng làm việc

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

bộ lọc theo tên container, không phải tên hình ảnh

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

là vấn đề vì tên hình ảnh có thể xuất hiện trong các cột khác cho các hình ảnh khác


1

Tôi đã thực hiện /usr/local/bin/docker.stoplấy tên hình ảnh (giả sử bạn chỉ có một cái đang chạy).

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

1

Tôi đã cố gắng bọc các lệnh Docker của mình trong các tác vụ gulp và nhận ra rằng bạn có thể làm như sau:

docker stop container-name
docker rm container-name

Điều này có thể không hoạt động đối với các tình huống trong đó bạn có nhiều container có cùng tên (nếu có thể), nhưng đối với trường hợp sử dụng của tôi thì nó hoàn hảo.


1

Trong trường hợp của tôi --filter ancestor=<image-name>không hoạt động, vì vậy lệnh sau đã dọn sạch bộ chứa Docker cho tôi:

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

1

liệt kê tất cả các container có thông tin và ID

docker ps

docker stop CONTAINER ID

1

Thêm vào đầu câu trả lời tuyệt vời của @VonC, đây là hàm ZSH mà bạn có thể thêm vào tệp .zshrc của mình:

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

Sau đó, trong dòng lệnh của bạn, chỉ cần làm dockstop myImageNamevà nó sẽ dừng và xóa tất cả các container được bắt đầu từ một hình ảnh gọi là myImageName.



0

sử dụng: docker container stop $ (docker container ls -q --filter aneopor = 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

Nếu bạn muốn thích một AWKcách tiếp cận đơn giản , đây là của tôi:

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

$(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}') - in tên thùng chứa docker dựa trên hình ảnh đầu vào

docker ps - liệt kê tất cả các container

awk '{ if($2 == "<your-image-name>") { print $NF}}'- Cột được phân tích cú pháp thứ hai của docker pstên hình ảnh. So sánh nó với tên hình ảnh của bạn sẽ thực hiện print $NFin tên container.

docker rm -f loại bỏ các container

Ví dụ: loại bỏ tất cả các thùng chứa hình ảnh Ubuntu đang chạy, có thể được thực hiện đơn giản như sau:

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

PS: Hãy nhớ bao gồm thẻ hình ảnh trong AWK, vì đó là một bộ so sánh bằng nhau.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.