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
これが一番お手軽な気がします。