あめも

初心者インフラエンジニアの仕事や日常の事をそれとなく書いていくブログです

Grafana 5.0.4から5.2.1へアップデートした時にattempt to write a readonly databaseが発生する

dockerで動いていたGrafanaをアップデートした際にattempt to write a readonly databaseメッセージが発生してコンテナが起動しなくなってしまいました。

  • アップデート前バージョン : 5.0.4
  • アップデート後バージョン : 5.2.1

Grafanaは公式Dockerイメージを利用して、docker-compose.ymlで起動していました
永続化に必要なファイルのみvolumesで指定しています

version: '3'
services:
  grafana:
    image: grafana/grafana
    hostname: grafana01
    container_name: grafana01
    ports:
      - "3000:3000"
    environment:
      GF_SECURITY_ADMIN_PASSWORD: "hogehoge"
      GF_SERVER_DOMAIN: "grafana.hogehoge.net"
    volumes:
      - /mnt/disks/ssd1/grafana/var/lib/grafana:/var/lib/grafana

docker pull前

[soran@bastion01 graphite]$ docker image list
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
grafana/grafana       latest              76ee92c26ff8        3 months ago        301 MB

docker pullで最新のimageを持ってきました

[soran@bastion01 graphite]$ docker pull grafana/grafana:latest
latest: Pulling from grafana/grafana
683abbb4ea60: Pull complete
4028112dabeb: Pull complete
a26fd976e08e: Pull complete
Digest: sha256:104f434d47c8830be44560edc012c31114a104301cdb81bad6e8abc52a2304f9
Status: Downloaded newer image for grafana/grafana:latest

最新のイメージの方が56MBほど軽くなっていました

[soran@bastion01 graphite]$ docker image list
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
grafana/grafana       latest              1bfead9ff707        3 weeks ago         245 MB
grafana/grafana       <none>              76ee92c26ff8        3 months ago        301 MB

古いGrafanaコンテナをdocker-compose stop & docker-compose rmで削除します

[soran@bastion01 graphite]$ docker-compose stop grafana
Stopping grafana01 ... done
[soran@bastion01 graphite]$ docker-compose rm grafana1
Going to remove grafana01
Are you sure? [yN] y
Removing grafana01 ... done

削除が完了したら、docker-compose upで新たにコンテナを起動します

[soran@bastion01 graphite]$ docker-compose up -d grafana
Starting grafana01 ...
Starting grafana01 ... done

すると、Stateが Exit 1となってしまい起動してくれません

[soran@bastion01 graphite]$ docker-compose ps
   Name                 Command               State                                 Ports
----------------------------------------------------------------------------------------------------------------------
grafana01    /run.sh                          Exit 1
graphite01   /sbin/my_init                    Up       0.0.0.0:2003->2003/tcp, 0.0.0.0:2004->2004/tcp,
                                                       0.0.0.0:2023->2023/tcp, 0.0.0.0:2024->2024/tcp,
                                                       0.0.0.0:80->80/tcp, 0.0.0.0:8125->8125/udp,
                                                       0.0.0.0:8126->8126/tcp

起動に失敗したコンテナのログを見るとこんな感じでした

[soran@bastion01 graphite]$ docker logs grafana01
GF_PATHS_DATA='/var/lib/grafana' is not writable.
You may have issues with file permissions, more information here: http://docs.grafana.org/installation/docker/#migration-from-a-previous-version-of-the-docker-container-to-5-1-or-later
t=2018-07-20T10:47:38+0000 lvl=info msg="Starting Grafana" logger=server version=5.2.1 commit=2040f61 compiled=2018-06-29T09:17:46+0000
t=2018-07-20T10:47:38+0000 lvl=info msg="Config loaded from" logger=settings file=/usr/share/grafana/conf/defaults.ini
t=2018-07-20T10:47:38+0000 lvl=info msg="Config loaded from" logger=settings file=/etc/grafana/grafana.ini
t=2018-07-20T10:47:38+0000 lvl=info msg="Config overridden from command line" logger=settings arg="default.paths.data=/var/lib/grafana"
t=2018-07-20T10:47:38+0000 lvl=info msg="Config overridden from command line" logger=settings arg="default.paths.logs=/var/log/grafana"
t=2018-07-20T10:47:38+0000 lvl=info msg="Config overridden from command line" logger=settings arg="default.paths.plugins=/var/lib/grafana/plugins"
t=2018-07-20T10:47:38+0000 lvl=info msg="Config overridden from command line" logger=settings arg="default.paths.provisioning=/etc/grafana/provisioning"
t=2018-07-20T10:47:38+0000 lvl=info msg="Config overridden from command line" logger=settings arg="default.log.mode=console"
t=2018-07-20T10:47:38+0000 lvl=info msg="Config overridden from Environment variable" logger=settings var="GF_PATHS_DATA=/var/lib/grafana"
t=2018-07-20T10:47:38+0000 lvl=info msg="Config overridden from Environment variable" logger=settings var="GF_PATHS_LOGS=/var/log/grafana"
t=2018-07-20T10:47:38+0000 lvl=info msg="Config overridden from Environment variable" logger=settings var="GF_PATHS_PLUGINS=/var/lib/grafana/plugins"
t=2018-07-20T10:47:38+0000 lvl=info msg="Config overridden from Environment variable" logger=settings var="GF_PATHS_PROVISIONING=/etc/grafana/provisioning"
t=2018-07-20T10:47:38+0000 lvl=info msg="Config overridden from Environment variable" logger=settings var="GF_SERVER_DOMAIN=grafana.gmossp-sp.jp"
t=2018-07-20T10:47:38+0000 lvl=info msg="Config overridden from Environment variable" logger=settings var="GF_SECURITY_ADMIN_PASSWORD=*********"
t=2018-07-20T10:47:38+0000 lvl=info msg="Path Home" logger=settings path=/usr/share/grafana
t=2018-07-20T10:47:38+0000 lvl=info msg="Path Data" logger=settings path=/var/lib/grafana
t=2018-07-20T10:47:38+0000 lvl=info msg="Path Logs" logger=settings path=/var/log/grafana
t=2018-07-20T10:47:38+0000 lvl=info msg="Path Plugins" logger=settings path=/var/lib/grafana/plugins
t=2018-07-20T10:47:38+0000 lvl=info msg="Path Provisioning" logger=settings path=/etc/grafana/provisioning
t=2018-07-20T10:47:38+0000 lvl=info msg="App mode production" logger=settings
t=2018-07-20T10:47:38+0000 lvl=info msg="Initializing SqlStore" logger=server
t=2018-07-20T10:47:38+0000 lvl=info msg="Connecting to DB" logger=sqlstore dbtype=sqlite3
t=2018-07-20T10:47:38+0000 lvl=info msg="Starting DB migration" logger=migrator
t=2018-07-20T10:47:38+0000 lvl=info msg="Executing migration" logger=migrator id="Add check_sum column"
t=2018-07-20T10:47:38+0000 lvl=eror msg="Executing migration failed" logger=migrator id="Add check_sum column" error="attempt to write a readonly database"
t=2018-07-20T10:47:38+0000 lvl=eror msg="Exec failed" logger=migrator error="attempt to write a readonly database" sql="alter table `dashboard_provisioning` ADD COLUMN `check_sum` TEXT NULL "
t=2018-07-20T10:47:38+0000 lvl=eror msg="Server shutdown" logger=server reason="Service init failed: Migration failed err: attempt to write a readonly database"

解決策はエラーログの冒頭に載っていたURLでした。
docs.grafana.org
どうやらGrafana 5.1からUIDが104から472へ変わった模様です。
結果、volumesで指定しているファイルへの書き込みができずにエラーとなったみたいです。

volumesで指定しているディレクトリを見ると確かにUID 104になっていました

[root@graphite01 ~]# ls -ltr /mnt/disks/ssd1/grafana/var/lib/grafana
total 13588
drwxr-xr-x.  3 104 107       36 Mar 19 16:17 plugins
drwx------. 18 104 107      150 Mar 19 16:17 sessions
drwxr-xr-x.  2 104 107        6 Jul 17 10:08 png
-rw-r--r--.  1 104 107 13912064 Jul 20 19:44 grafana.db

対応方法

docker-compose.yml でUIDを指定する

  • 実行ユーザーを472ではなく104に指定すると起動に成功します
version: '3'
services:
  grafana:
    image: grafana/grafana
    hostname: grafana01
    container_name: grafana01
    ports:
      - "3000:3000"
    user: "104"
    environment:
      GF_SECURITY_ADMIN_PASSWORD: "hogehoge"
      GF_SERVER_DOMAIN: "grafana.hogehoge.net"
    volumes:
      - /mnt/disks/ssd1/grafana/var/lib/grafana:/var/lib/grafana

しかし、Ubuntu16.04では104はsyslogで使用されているとの事なので、Ubuntuでは望ましくない方法になります。

volumesのUIDを変更する

古いGrafanaで生成されたUID 104で作成されているファイルをchownでUID 472に変更します

[root@graphite01 ~]# chown -R 472:107 /mnt/disks/ssd1/grafana/var/lib/grafana4
[root@graphite01 ~]# ls -ltr /mnt/disks/ssd1/grafana/var/lib/grafana4
total 13588
drwxr-xr-x.  3 472 107       36 Mar 19 16:17 plugins
drwx------. 18 472 107      150 Mar 19 16:17 sessions
drwxr-xr-x.  2 472 107        6 Jul 17 10:08 png
-rw-r--r--.  1 472 107 13912064 Jul 20 20:31 grafana.db

これで、Grafana 5.2以降で実行されるUID 472のままコンテナの起動が可能です


次はGrafanaをGithubアカウントでログインする方法を書きたいと思います。