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

Dockerで立ち上げたMastodonのDBを後から永続化する

概要

Mastodon、流行っていますね。私も勢いに乗ってAzure上にインスタンスを立ち上げました。
見事にデータの永続化設定を忘れたまま起動して今に至ります。

v1.2に上げるためにコンテナを一度落とす必要が出てきましたが、
どうにかデータを維持したまま再起動ができたため、メモしておきます。

mastodon

……飛んでいくデータを表現しているみたいで嫌ですね。

ホスト内にデータ格納先を作成

今回は /usr/share/mastodon に諸々置いていたため、同じ場所に作成しました。

postgres用ディレクトリ作成
[root@mstdn001 ~]# mkdir /usr/share/mastodon/postgresql

対象コンテナの確認

PostgreSQLのコンテナ名を確認します。(横スクロールで見えます)

コンテナ名の確認
[root@mstdn001 ~]# docker ps
CONTAINER ID     IMAGE               COMMAND                  CREATED         STATUS          PORTS                              NAMES
d849f18a9e9b     gargron/mastodon    "bundle exec rails s "   3 days ago      Up 3 days       0.0.0.0:3000->3000/tcp, 4000/tcp   mastodon_web_1
c8fbcc7633de     gargron/mastodon    "bundle exec sidekiq "   3 days ago      Up 3 days       3000/tcp, 4000/tcp                 mastodon_sidekiq_1
33db6dcac1cd     gargron/mastodon    "npm run start"          3 days ago      Up 3 days       3000/tcp, 0.0.0.0:4000->4000/tcp   mastodon_streaming_1
3829643b3b41     postgres:9.6-alpine "docker-entrypoint.sh"   3 days ago      Up 3 days       5432/tcp                           mastodon_db_1
0d764d54cc62     redis:alpine        "docker-entrypoint.sh"   3 days ago      Up 3 days       6379/tcp                           mastodon_redis_1

postgresが動作しているのは mastodon_db_1 ですね。

データの救出

docker cp というコマンドで、実データをコンテナ内から取り出します。
docker cp <コンテナ名>:<コンテナ内のフルパス> <ホストの相対パス> の形で入力します。

postgresのデータを救出
[root@mstdn001 ~]# cd /usr/share/mastodon
[root@mstdn001 mastodon]# docker-compose pause
[root@mstdn001 mastodon]# docker cp mastodon_db_1:/var/lib/postgresql/data ./postgresql/data
コピー結果を確認
[root@mstdn001 mastodon]# ls -l ./postgresql/data/
total 56
drwx------. 5 root root    41 Apr 15 14:49 base
drwx------. 2 root root  4096 Apr 17 18:36 global
drwx------. 2 root root    18 Apr 15 14:49 pg_clog
drwx------. 2 root root     6 Apr 15 14:49 pg_commit_ts
drwx------. 2 root root     6 Apr 15 14:49 pg_dynshmem
-rw-------. 1 root root  4492 Apr 15 14:49 pg_hba.conf
-rw-------. 1 root root  1636 Apr 15 14:49 pg_ident.conf
drwx------. 4 root root    39 Apr 15 14:49 pg_logical
drwx------. 4 root root    36 Apr 15 14:49 pg_multixact
drwx------. 2 root root    18 Apr 15 15:20 pg_notify
drwx------. 2 root root     6 Apr 15 14:49 pg_replslot
drwx------. 2 root root     6 Apr 15 14:49 pg_serial
drwx------. 2 root root     6 Apr 15 14:49 pg_snapshots
drwx------. 2 root root     6 Apr 15 15:20 pg_stat
drwx------. 2 root root    63 Apr 18 21:46 pg_stat_tmp
drwx------. 2 root root    18 Apr 15 14:49 pg_subtrans
drwx------. 2 root root     6 Apr 15 14:49 pg_tblspc
drwx------. 2 root root     6 Apr 15 14:49 pg_twophase
-rw-------. 1 root root     4 Apr 15 14:49 PG_VERSION
drwx------. 3 root root    92 Apr 18 17:26 pg_xlog
-rw-------. 1 root root    88 Apr 15 14:49 postgresql.auto.conf
-rw-------. 1 root root 22205 Apr 15 14:49 postgresql.conf
-rw-------. 1 root root    24 Apr 15 15:20 postmaster.opts
-rw-------. 1 root root    85 Apr 15 15:20 postmaster.pid

docker-compose.yml の修正

docker-compose.yml を修正して、ホストとコンテナのディレクトリを紐付けます。
Uncomment to enable DB persistance の下2行がコメントになっているので解除し、パスを修正します。
- <ホストの相対パス>:<コンテナ内のフルパス> となります。先ほどとは逆なので注意です。

docker-compose.yml
version: '2'
services:

  db:
    restart: always
    image: postgres:9.6-alpine
### Uncomment to enable DB persistance
     volumes:
       - ./postgres/data:/var/lib/postgresql/data


#(以下略)

# 今回の内容とは関係ありませんが、
#「image: postgres:alpine」を「image: postgres:9.6-alpine」に書き換えることで、
# 勝手にPostgresのバージョンが上がることを防いでいます。

コンテナの再起動

Postgres用コンテナを再起動します。
docker-compose を利用するためディレクトリの移動を忘れずに。

dbコンテナを再起動
[root@mstdn001 ~]# cd /usr/share/mastodon/
[root@mstdn001 mastodon]# docker-compose unpause
[root@mstdn001 mastodon]# docker-compose up -d db
Starting mastodon_db_1

動作確認

PCや適当なクライアントから繋いでみたり、トゥートしてみて確認します。
ちゃんと動いていて、過去のデータも残っていれば完璧です。

先にdocker-compose.ymlを修正しておいて、docker cp からコンテナ再起動までの時間をなるべく短くした方が良いかもしれません。

参考情報

下記サイト等を参考にしました。ありがとうございました。

2017/04/19 追記
@hidekuro さんからの編集リクエストを元に、手順を一部修正しました。
アドバイスありがとうございました!

Why do not you register as a user and use Qiita more conveniently?
  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
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