mastodon の postgres と redis の永続化

放っとくと docker コンテナの中にデータ持っちゃうやつですね。対応したつもりだったんですが……対応できてませんでしたオチ。

mastodon_db_1 も mastodon_redis_1 も、基本的にコンテナが再作成されないでずっと使い回されるんですよね。なので1回消してやる必要があったのかなぁとか思ってます。

うまくいく保証はできませんし、データ吹っ飛ばす覚悟はしといてくださいね。今回は redis ですが postgres でも同じようなもんだと思います。

永続化設定

docker-compose.yml のコメントを外して好きなパスにする。

  redis:
    restart: always
    image: redis:alpine
### Uncomment to enable REDIS persistance
    volumes:
      - ./redis/data:/data

コンテナ内のデータ救出

まずデータの更新を止めて

# docker-compose pause

docker cp でデータを吸い出します。

# docker cp mastodon_redis_1:/data ./redis/

コンテナ削除

一度停止して

# docker-compose unpause && docker-compose stop

コンテナを削除します。

# docker rm mastodon_redis_1

ちょっと隙が大きくてデータ更新されちゃうかもですけどまぁしょうがない。ちなみにサラッと書いてますが docker rm した時点でデータ吹っ飛ぶので、docker cp の結果だけはしっかり確認して、なんなら確保したデータをどこかにバックアップしておいてくださいね。

コンテナ再作成

ここ、ちょっとまだ理解不足なんですけど、基本的に再起動すれば勝手に redis コンテナ作ってくれますよね?

# docker-compose up -d

docker-compose build って必要なのかな……

いずれにしろ、1回 docker rm とかでコンテナ消して、再作成されるタイミングで docker-compose.yml の設定が効いてくるようです。設定入れて docker-compose up -d とかで再起動しただけではたぶん反映されません。

コンテナの中でファイル作ります。

# docker exec -it mastodon_redis_1 /bin/sh
/data # touch hoge

で、コンテナの外でファイルができていることを確認します。

# ls -l ./redis/data/
total 753
-rw-r--r-- 1  100  101 770055 May 22 17:35 dump.rdb
-rw-r--r-- 1 root root      0 May 22 17:37 hoge

またコンテナの中で作ったファイルを削除します。

/data # rm hoge

コンテナの外でファイルが消えていることを確認します。

# ls -l ./redis/data/
total 753
-rw-r--r-- 1 100 101 770055 May 22 17:35 dump.rdb

これが一番お手軽な気がします。

https://manimani.cc/lib/plugins/linkback/exe/trackback.php/blog:2017:20170522164813_mastodon_db_redis_persistence