カクカクしかじか

技術的なアレコレ

Dockerのミドルウェア(DB)のバージョンを上げた時にデータベースに接続出来なくなる場合の雑な解決法

前提

概要

Dockerを使って起動しているPostgreSQLのバージョンを上げた後にRailsサーバーを起動し、localhost:3000にアクセスしたところ PG::ConnectionBad のエラーが出るようになりました。
解決法に至るまでの過程を雑にメモとして放流します。

docker-compose.ymlの内容

volumesの部分に実際のDBのデータを格納していくという雑な理解をしています。
なお今回の場合、開発環境のRailsで使用するデータは主にdataディレクトリに格納されています。

version: '3'
services:
<中略>
  postgresql:
    image: postgres:9.5.16
    volumes:
      - ./postgresql/data:/usr/local/var/postgres
      - ./postgresql/entrypoint:/docker-entrypoint-initdb.d
    ports:
      - 127.0.0.1:5432:5432
    environment:
      PGDATA: /usr/local/var/postgres
<中略>

プロセスの確認

Postgreだけ動いてないっぽいことを確認...

$ docker-compose ps
            Name                          Command               State                  Ports
-----------------------------------------------------------------------------------------------------------
provisioning_elasticsearch_1   /bin/bash bin/es-docker          Up       127.0.0.1:9200->9200/tcp, 9300/tcp
provisioning_postgresql_1      docker-entrypoint.sh postgres    Exit 1
provisioning_redis_1           docker-entrypoint.sh redis ...   Up       127.0.0.1:6379->6379/tcp

ログを見てみる

9.3から9.5.16に上げたものの、古いゴミが残っているっぽい?

$ docker logs provisioning_postgresql_1
LOG:  skipping missing configuration file "/usr/local/var/postgres/postgresql.auto.conf"
FATAL:  database files are incompatible with server
DETAIL:  The data directory was initialized by PostgreSQL version 9.3, which is not compatible with this version 9.5.16.

Postgreをマウントしているディレクトリへ移動

$ cd postgresql/
$ ls
data       entrypoint
$ cd data/
$ ls
PG_VERSION      global          pg_hba.conf     pg_multixact    pg_serial       pg_stat         pg_subtrans     pg_twophase     postgresql.conf
base            pg_clog         pg_ident.conf   pg_notify       pg_snapshots    pg_stat_tmp     pg_tblspc       pg_xlog         postmaster.opts
$ vim PG_VERSION
# ここでPG_VERSIONに9.3の記述を確認した

古いゴミを削除

なお今回の場合は、dataディレクトリを消すと古いバージョン9.3のゴミも消えますが、ローカルのDBデータをここにマウントしているため、ゴミと一緒にそれまでのデータも消えてしまうので注意が必要です。
(今回は特に問題なかったので普通に削除しました)

ローカル環境だと特に問題にならないと思いますが、本番環境の場合はどうなるのか?気になるので、本番をDockerで運用している方に今度バージョンアップの際のアレコレを聞いてみようと思います。

$ rm -rf data

再びDockerを立ち上げる

無事に起動した模様!

$ docker-compose up -d
$ docker-compose ps
            Name                          Command               State                 Ports
----------------------------------------------------------------------------------------------------------
provisioning_elasticsearch_1   /bin/bash bin/es-docker          Up      127.0.0.1:9200->9200/tcp, 9300/tcp
provisioning_postgresql_1      docker-entrypoint.sh postgres    Up      127.0.0.1:5432->5432/tcp
provisioning_redis_1           docker-entrypoint.sh redis ...   Up      127.0.0.1:6379->6379/tcp

最後に

Dockerは遅ればせながら最近ようやくいじり始めたので、まだ全然理解出来ていないのですが、コツコツいじりつつ慣れていこうと思った次第です。