Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@devneko

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

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
5
Help us understand the problem. What are the problem?