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?

Collin Estes
sumber

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}}"))
VONC
sumber
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
63

Jawaban sebelumnya tidak berhasil untuk saya, tetapi ini berhasil:

docker stop $(docker ps -q --filter ancestor=<image-name> )
Koekiebox
sumber
1
Penggunaan leluhur yang menarik di sana ( docs.docker.com/engine/reference/commandline/ps/#filtering ). +1
VonC
1
Bekerja di Terminal Docker untuk Windows juga.
Koekiebox
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>
Javier Sánchez
sumber
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}')
ArgonQQ
sumber
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:

kalyani chaudhari
sumber
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>))
ankitj
sumber
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

Jay
sumber
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")
AmanicA
sumber
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.

Matt Gaunt
sumber
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}}"))
Alexey
sumber
1

daftar semua wadah dengan info dan ID

docker ps

docker stop CONTAINER ID
Muhammed Moussa
sumber
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.

Antoine Jaussoin
sumber
0
docker stop $(docker ps -a | grep "zalenium")
docker rm $(docker ps -a | grep "zalenium")

Ini sudah cukup.

Berkay Kırmızıoğlu
sumber
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$
ABU
sumber
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.

ashutosh
sumber
-5

Anda dapat menggunakan psperintah untuk melihat wadah yang sedang berjalan:

docker ps -a

Dari sana Anda akan melihat nama wadah Anda bersama dengan ID wadah yang Anda cari. Berikut informasi lebih lanjut tentangdocker ps .

Aaron Tracy
sumber
Tautan rusak ( Maaf, kami tidak dapat menemukan halaman itu ).
Peter Mortensen