web-dev-qa-db-ja.com

実行中の場合は、Dockerコンテナを停止して削除します

Dockerコンテナが実行中の場合、実用的に停止して削除することを検討しています。これはビルドスクリプト用です。

次の例をご覧ください。 bashスクリプトのNAMES列の下にあるように、Dockerコンテナ「rabbitmq」を停止して削除するにはどうすればよいですか。

docker ps

CONTAINER ID        IMAGE             COMMAND                  CREATED             STATUS              PORTS                   NAMES
9909a5e2856f        rabbitmq-image   "/docker-entrypoint.s"   11 minutes ago      Up 11 minutes       0.0.0.0:5672->5672/tcp, rabbitmq
8990dd1fe503        redis-image      "/entrypoint.sh redis"   6 weeks ago         Up 4 days           0.0.0.0:32770->6379/tcp redis
etc 

次のコマンドは、コンテナを削除し、imが探していることを行います

docker stop rabbitmq && docker rm -f rabbitmq

しかし、それを私が知りたいスクリプトにまとめると、このように見えると思います。

#!/bin/bash

if [ /*docker ps check some value */ ]; then
   docker stop rabbitmq && docker rm -f rabbitmq
fi
48
Robbo_UK

おそらくお気づきのとおり、docker stopおよびdocker rmは、コンテナが存在しないか実行されていない場合、失敗を示すステータスコードで終了します。これにより、ビルドが失敗します。

ビルドログのエラーメッセージに対処できる場合は、シェルコマンドが失敗するのを防ぐために、この小さなトリックを実行できます。

docker stop rabbitmq || true && docker rm rabbitmq || true

Dockerコマンドの1つが失敗した場合、trueが呼び出され、常に成功を示すステータスコードで終了します。

113
Johannes Barop

同様の問題がありますが、「not found」エラーではなく、コマンドからのallエラーを抑制するため、受け入れられた回答が好きではありませんでした。

ただし、docker ps -q --filter "name=rabbitmq"は、その名前のコンテナが実際に存在する場合にのみ出力を生成するため、 コマンドが空の文字列を出力するかどうかをテストする に思いつきました。

docker ps -q --filter "name=rabbitmq" | grep -q . && docker stop rabbitmq && docker rm -fv rabbitmq

次のコマンドは、フィルター定義のテストにも役立ちます。

docker ps -q --filter "name=rabbitmq" | grep -q . && echo Found || echo Not Found

私の実際の使用例は、以前のタスクで生成された名前のリストから現在実行中かどうかに関係なく、すべての既存のコンテナを削除するAnsibleタスクのペアを定義することでした。

- name: Check for containers that actually exist
  Shell: 'docker ps -aq --filter "name={{ item }}"'
  with_items:
    - '{{ previous_command.stdout_lines }}'
  register: found_containers

- name: Remove the containers found by the above command
  Shell: 'docker stop {{ item.item }} && docker rm -fv {{ item.item }}'
  with_items: '{{ found_containers.results }}'
  when: item.stdout
22
ncoghlan

次を使用できます。

app="rabbitmq"
if docker ps | awk -v app="$app" 'NR > 1 && $NF == app{ret=1; exit} END{exit !ret}'; then
  docker stop "$app" && docker rm -f "$app"
fi
  • awkコマンドは、BASHの変数$appからコマンドラインvar appを取得します
  • NR>1は、docker psコマンドから最初のヘッダー行をスキップします。
  • $(NF) == app最後の列を比較NAMESはアプリ変数と等しいかどうか
12
anubhava

しばらくの間、Dockerを使用しています。これは、Dockerコンテナを停止および削除するための私の推奨方法です。

docker rm -f container_name || true
9
Robbo_UK
# Stop the running "rabbitmq" container if there is one
CONTAINER_NAME="rabbitmq"
OLD="$(docker ps --all --quiet --filter=name="$CONTAINER_NAME")"
if [ -n "$OLD" ]; then
  docker stop $OLD && docker rm $OLD
fi
3
iver56

この呪文をbashで提案する:

( docker stop $CONTAINER > /dev/null && echo Stopped container $CONTAINER && \
  docker rm $CONTAINER ) 2>/dev/null || true

常に0で終了し、コンテナが実行されていなくても文句を言わず、実際に停止した場合はStopped container $CONTAINERを出力します。

1
DS.

停止したコンテナを削除しない場合、これに対処する別の簡単な方法は、docker ps -aに依存することです。これは常にそのコンテナIDを返します。次に、停止したコンテナでdocker stopを実行しても、べき等には何も行われません。

docker stop $(docker ps -a --filter name= rabbitmq -q )

0
Svend

stopおよびremove allが必要な場合は、script.shにこのコードをコピーします

#!/bin/sh
ids=$(docker ps -a -q)
for id in $ids
do
  echo "$id"
  docker stop $id && docker rm $id
done
0
Alex Montoya