2015-12-11 13 views
17

稼動しているドッキングコンテナを実際に停止して削除しようとしています。これはビルドスクリプト用です。稼働中のドッカーコンテナを停止して削除する

次の例を参照してください。 bashスクリプトのNAMES列の下に表示されているように、ドッキング・コンテナ「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 

次のコマンドを実行すると、コンテナを削除し、

docker stop rabbitmq && docker rm -f rabbitmq 

を行うために探して何イムいますしかしその私が知りたいのですが、スクリプトにそれをコーミング?私はそれがこのような何かを見てと思います。

#!/bin/bash 

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

答えて

55

あなたはおそらく気づいてきたように、ステータスコードを示す不全docker stopだけでなくdocker rmとして出口はコンテナが存在しないか、実行されていない場合は、最後の列を比較してください。その結果、ビルドに失敗します。 trueは、ドッキングウィンドウのコマンドのいずれかに障害が発生している場合には

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

:あなたはあなたのビルドでエラーメッセージに対応できる場合

は、あなたが失敗のシェルコマンドを防ぐために、この小さなトリックを行うことができますログ常に成功を示すステータスコードで終了します。

+0

ベストアンサー!!!! –

+0

コンテナが存在しないというエラーメッセージは返されますが、ステータスコードは成功を示しています。私の竹パイプラインプロセスは失敗しないので、それは私のために働く。 – shamanSK

+0

これは、コンテナがすでに削除されている場合、 'daemonからのエラー応答:そのようなid:rabbitmq'を生成します。 – anubhava

9

あなたは使用することができます。

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コマンドがdocker psコマンドからBASHの変数$app
  • NR>1スキップ最初のヘッダー行からコマンドラインVAR appを取得します。
  • $(NF) == appNAMESは、変数のアプリに等しいか
+0

こんにちは、ありがとうございました。あなたはそのことを少しでも拡張することができますか?私はapp = '' some-rabbitmq 'を持っていると、それはハイフンが気に入らないのですか? –

+0

ハイフンで動作するはずです。答えにいくつかの説明を追加しています。 – anubhava

+1

あまりにも複雑な解決策です。 2番目の答えはより良い –

5

私は同様の問題を抱えていますが、受け入れられた答えが抑制されているので、すべてエラーが「見つからない」というエラーではなくエラーになります。

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

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

次のコマンドはまた、テストフィルタの定義に便利です。その名前のコンテナが実際に存在するかどう

しかし、docker ps -q --filter "name=rabbitmq"は私が思いついたのでTest if a command outputs an empty stringに触発され、出力を生成します


私の実際の使用例は、現在実行中のすべてのコンテナ(実行中かn以前のタスクで生成された名前のリストからOT):

- 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 
4

長いしばらくの間、今ドッキングウィンドウを使用して。これは、ドッカーコンテナを停止して取り除くための私の好きな方法です。最初にあなたが

docker kill $(docker ps -q) 

持つすべてのコンテナを停止し、すべてのコンテナ

docker rm $(docker ps -a -q) 

を削除する必要があり、あなたはすべての画像を削除したい場合は、このコマンドですべてのコンテナを停止する

docker rm -f || true 
1

docker rmi $(docker images -q) 
0
# 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 
関連する問題