Help us understand the problem. What is going on with this article?

【Docker運用】データコンテナがコンテナの一括削除で削除されないようにする方法

More than 3 years have passed since last update.

Dockerを運用していると次第に終了したコンテナが溜まっていくので、定期的に終了したコンテナを一括削除する必要があります。

色々なサイトで紹介されている下記のコマンドを使うと一括で終了したコンテナを削除できます。

docker rm $(docker ps -aq)

しかし、データコンテナを使っている場合は、このコマンドは使えません。データコンテナはコンテナとしてはアクティブではないので、このコマンドを使うと削除されてしまうからです。
もし削除されてもデータが消えてしまうわけではありませんが、コンテナ名やIDでアクセスできなくなったりと、色々と面倒なことになります。

コンテナのステータスでフィルタリングする

docker createコマンドによってデータコンテナが作られている場合であれば、下記のようにstatus=exitedでフィルタすることによって、この問題を回避できます。なお、docker createコマンドを使ってコンテナを作った場合はstatusはcreatedとなります。

docker rm $(docker ps -aq -f status=exited)

ラベルとシェルスクリプトを使って削除対象から外す

しかし、レアケースかもしれませんが、docker runを使ってデータコンテナを作る必要があったり、誤ってdocker startしてステータスがexitedになるといったケースも考えると、ラベルを使ってデータコンテナを識別することで削除対象から除けた方がより安全です。

ラベルはDockerfile、docker create/runコマンドのオプションで設定できます。

*ラベルをdocker create時に設定する例

docker create --name my-data --label "container-type=data" -v /data busybox

例では "containert-type=data" というラベルを付けています。

ラベルを付けておくことで docker ps コマンドの --filter オプションでフィルタリングが可能になります。これでデータコンテナを区別することができます。

ただし、--filterオプションでは「〜以外」という条件設定はできないようなので、シェルスクリプトを使ってなんとかする必要があります。

*データコンテナだけを残してコンテナを削除するスクリプト

"container-type=data"のラベルがついたコンテナを除いて削除を実行します。

#!/bin/bash

data_containers=`mktemp -t data-containers-`
docker ps -a --filter "label=container-type=data" -q  | sort > $data_containers
exited_containers=`mktemp -t exited-containers-`
docker ps -a -f status=exited -q  | sort > $exited_containers

remove_targets=$(comm -23 $exited_containers $data_containers)
docker rm $remove_targets

そのほかの方法

あとは、何かしらプロセスを立ち上げてデータコンテナを起動状態にしておくという方法もあると思います。

追記

最近ではボリュームを個別に管理できるのでそもそもデータコンテナを使う必要性がなさそうです。
docker volume系のコマンドを使って管理するのがよいと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした