Menghentikan kontainer Docker dengan nama gambar - Ubuntu


156

Di Ubuntu 14.04 (Trusty Tahr) saya sedang mencari cara untuk menghentikan wadah yang sedang berjalan dan satu-satunya informasi yang saya miliki adalah nama gambar yang digunakan dalam perintah run Docker.

Apakah ada perintah untuk menemukan semua wadah yang cocok yang cocok dengan nama gambar itu dan menghentikannya?

Jawaban:


211

Setelah masalah 8959 , awal yang baik adalah:

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

Sejak namemengacu pada wadah dan bukan nama gambar, Anda akan perlu menggunakan lebih baru leluhur Docker 1,9 penyaring , disebutkan dalam koekiebox 's jawaban .

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

Seperti yang dikomentari di bawah oleh Kiril , untuk menghapus wadah-wadah itu:

stop mengembalikan kontainer juga.

Jadi chaining stopdan rmakan melakukan pekerjaan:

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

Ini bagus. Masalah saya setelah itu adalah ketika melepaskan wadah, karena mereka terhenti, mereka tidak dikembalikan oleh buruh pelabuhan pd. Adakah petunjuk tentang cara melakukannya?
kiril

@kiril pemberhentian kontainer dikembalikan oleh ps -a. Wadah yang dihapus ... yah, sudah dihapus, tidak ada lagi.
VonC

1
Terima kasih, saya tidak menyadari berhenti mengembalikan wadah juga. Jadi rantai berhenti dan rm akan melakukan pekerjaan: buruh pelabuhan rm $ (buruh pelabuhan berhenti $ (buruh pelabuhan ps -a -q --filter = "name = <imageName>"))
kiril

@kiril Itulah idenya, ya.
VonC


44

Anda bisa memulai wadah pengaturan nama wadah:

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

Gambar yang sama dapat digunakan untuk memutar banyak wadah, jadi ini adalah cara yang baik untuk memulai wadah. Maka Anda bisa menggunakan nama wadah ini untuk berhenti, melampirkan ... wadah:

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

Saya sangat suka solusi ini. Apakah ada cara yang lebih baik untuk membangun, menghentikan / melepas dan kemudian menjalankan wadah dari ini? sudo docker build . -t <img-name> && sudo docker stop <container-name> || true && sudo docker run -d --rm --name <container-name> <img-name>
melanke

16

Kode ini akan menghentikan semua wadah dengan gambar centos: 6 . Saya tidak dapat menemukan solusi yang lebih mudah untuk itu.

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

Atau bahkan lebih pendek:

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

1
butuh peningkatan :::: buruh pelabuhan berhenti $ (buruh pelabuhan ps -a | grep centos: 6 | awk '{print $ 1}')
Shailesh kumar

@Shaileshkumar Menambahkan versi Anda =)
ArgonQQ

9

Dua cara untuk berhenti menjalankan wadah:

1. $docker stop container_ID

2. $docker kill container_ID

Anda bisa menjalankan wadah menggunakan perintah berikut:

$docker ps

Tautan berikut untuk informasi lebih lanjut:


Tautan terakhir rusak ( "Maaf, kami tidak dapat menemukan halaman itu" ).
Peter Mortensen

Apakah ini benar $docker? Atau $dari prompt shell?
Peter Mortensen

2

Untuk Docker versi 18.09.0 saya menemukan bahwa flag format tidak diperlukan

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

2

Hentikan kontainer buruh pelabuhan dengan nama gambar:

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

Hentikan kontainer buruh pelabuhan dengan nama gambar dan tag:

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

Jika Anda membuat gambar, Anda dapat menambahkan label ke sana dan memfilter wadah yang berjalan berdasarkan label

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

Metode yang tidak dapat diandalkan

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

tidak selalu berhasil

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

memfilter menurut nama wadah, bukan nama gambar

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

bermasalah karena nama gambar dapat muncul di kolom lain untuk gambar lainnya


1

Saya membuat /usr/local/bin/docker.stopyang mengambil nama gambar (menganggap Anda hanya memiliki satu berjalan).

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

1

Saya mencoba untuk membungkus perintah Docker saya dalam tugas menelan dan menyadari bahwa Anda dapat melakukan hal berikut:

docker stop container-name
docker rm container-name

Ini mungkin tidak berfungsi untuk skenario di mana Anda memiliki beberapa wadah dengan nama yang sama (jika itu mungkin), tetapi untuk kasus penggunaan saya itu sempurna.


1

Dalam kasus saya --filter ancestor=<image-name>tidak berfungsi, jadi perintah berikut membersihkan wadah Docker untuk saya:

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


1

Menambahkan di atas jawaban luar biasa @VonC, berikut adalah fungsi ZSH yang dapat Anda tambahkan ke file .zshrc Anda:

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

Kemudian di baris perintah Anda, cukup lakukan dockstop myImageNamedan itu akan berhenti dan menghapus semua kontainer yang dimulai dari gambar bernama myImageName.



0

gunakan: buruh pelabuhan kontainer hentikan $ (kontainer buruh pelabuhan ls -q --filter leluhur = 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

Jika Anda ingin memilih AWKpendekatan yang sederhana , inilah pilihan saya:

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

$(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}') - mencetak nama wadah buruh pelabuhan berdasarkan pada gambar input

docker ps - daftar semua wadah

awk '{ if($2 == "<your-image-name>") { print $NF}}'- Kolom parsed kedua docker psmemberi nama gambar. Membandingkannya dengan nama gambar Anda akan mengeksekusi print $NFyang mencetak nama wadah.

docker rm -f menghapus wadah

Misalnya, menghapus semua wadah gambar ubuntu yang berjalan, dapat dilakukan hanya dengan:

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

PS: Ingatlah untuk memasukkan tag gambar dalam AWK, karena itu adalah pembanding yang sama.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.