前提
- Docker for Macを使用している
- RailsアプリのミドルウェアだけをDocker化している
- /provisioningディレクトリを作り、そこにdocker-compose.ymlを配置している
- dockerコマンドはdocker-compose.ymlを配置したディレクトリで実行
概要
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は遅ればせながら最近ようやくいじり始めたので、まだ全然理解出来ていないのですが、コツコツいじりつつ慣れていこうと思った次第です。