web-dev-qa-db-ja.com

docker ps -aのシェルスクリプト実行中の特定のコンテナの数を見つけるためのgrep

新しいコンテナーをビルドして実行する前に、「類似した」Dockerコンテナーを削除する開発ビルドサーバーによって実行されるスクリプトを記述したいと思います。

以下は、必要なbashスクリプトの疑似コードです

var name = $1
var number_of_results = # of containers returned from $(docker ps -a | grep "$name")

if(number_of_result > 0)
      docker rm -f $(docker ps -a | grep "$name")
6
TheJediCowboy

次のスクリプトはあなたが望むことをするはずです:

#!/bin/bash

name=$1

matchingStarted=$(docker ps --filter="name=$name" -q | xargs)
[[ -n $matchingStarted ]] && docker stop $matchingStarted

matching=$(docker ps -a --filter="name=$name" -q | xargs)
[[ -n $matching ]] && docker rm $matching

基本的に、提供された名前で実行中のコンテナがあるかどうかをチェックし、見つかった場合は停止します。次に、指定された名前のコンテナを削除します。

:引数なしで使用する場合、このスクリプトは実行中のすべてのコンテナーを停止し、停止したすべてのコンテナーを削除するため、いくつかの引数検証を追加することができます。シンプルで読みやすくするために、ここには追加しませんでした。

2
aanc

少なくとも2つのケースを考慮する必要があります-単一のコマンドで削除できる停止したコンテナーの削除と、削除する前にコンテナーを最初に停止する必要がある実行中のコンテナーの削除。

これに加えて、コンテナ名を見つけるためにgrepを使用する代わりに、docker psfilterオプションを使用するので、間違ってgreppingすることはありませんコマンドオプションがgrepに配置した名前と一致しているという理由だけでコンテナ。ここに私が同様のDockerコンテナを削除する方法があります、厳密に以下のシーケンスに従ってください-

  1. 実行中のコンテナを削除する
$(docker ps --filter = "name = $ name" -q);のcontainer_idの場合、docker stop $ container_id && docker rm $ container_id; done
  1. ステップ1でコンテナーの実行を停止したため、停止したコンテナーを削除します。
$(docker ps --filter = "name = $ name" -q -a);のcontainer_idの場合、docker rm $ container_id; doneを実行

-aオプションには、停止したコンテナを含むすべてのコンテナが含まれます。デフォルトのオプションである-aを使用しない場合、実行中のコンテナのみが含まれます。したがって、ステップ1で実行中のコンテナーを削除し、次にステップ2で停止したコンテナーを続行します。コンテナーを削除または停止するには、コンテナーIDだけが必要です。-qオプションはIDのみを出力します。

2
Daniel t.