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
おそらくお気づきのとおり、docker stop
およびdocker rm
は、コンテナが存在しないか実行されていない場合、失敗を示すステータスコードで終了します。これにより、ビルドが失敗します。
ビルドログのエラーメッセージに対処できる場合は、シェルコマンドが失敗するのを防ぐために、この小さなトリックを実行できます。
docker stop rabbitmq || true && docker rm rabbitmq || true
Dockerコマンドの1つが失敗した場合、true
が呼び出され、常に成功を示すステータスコードで終了します。
同様の問題がありますが、「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
次を使用できます。
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
はアプリ変数と等しいかどうかしばらくの間、Dockerを使用しています。これは、Dockerコンテナを停止および削除するための私の推奨方法です。
docker rm -f container_name || true
# 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
この呪文をbashで提案する:
( docker stop $CONTAINER > /dev/null && echo Stopped container $CONTAINER && \
docker rm $CONTAINER ) 2>/dev/null || true
常に0で終了し、コンテナが実行されていなくても文句を言わず、実際に停止した場合はStopped container $CONTAINER
を出力します。
停止したコンテナを削除しない場合、これに対処する別の簡単な方法は、docker ps -a
に依存することです。これは常にそのコンテナIDを返します。次に、停止したコンテナでdocker stop
を実行しても、べき等には何も行われません。
docker stop $(docker ps -a --filter name= rabbitmq -q )
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