docker-composeで起動したredisに接続できないため、railsのresqueが動かなくなった。
つい最近まで、redisのバージョン指定をlatestにしていたのだけれど、heroku-redisに合わせようと思って3.2.12に変更していた。
version: "3" services: redis: image: redis:3.2.12-alpine # 以前はlatestだった ports: - "6379:6379" volumes: - .docker/redis/data:/data restart: unless-stopped
普段はローカル環境でresqueを動かすときは個別にresqueを動かすようにしているので、resqueを使おうと思ったタイミングでわかった。
rails aborted! Redis::CannotConnectError: Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED) Original Exception (Redis::CannotConnectError): Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)
調査
redisのバージョンをlatestに戻すと繋がり、3.2.12にすると繋がらなくなるので、gemのredisに問題があるのか?と疑ってググっていたのだけれど、何も見つからず。
docker-composeではなく、dockerコマンドで起動した後、redis-cliで繋いでみたところ、接続できた。
$ docker run -d -p 6379:6379 redis:3.2.12-alpine 21795a03ab97b7021c5d1de567ed4a16c3c0c98dbf948e1b4110bbaaedd406ca $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 21795a03ab97 redis:3.2.12-alpine "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 0.0.0.0:6379->6379/tcp unruffled_gauss $ redis-cli -h localhost -p 6379 localhost:6379> exit $ docker stop 21795a03ab97
接続できたのでとりあえず停止。
次はdocker-composeで起動してみる。
$ docker-compose up -d Creating network "foo_default" with the default driver Creating foo_redis_1 ... done $ redis-cli -h localhost -p 6379 Could not connect to Redis at localhost:6379: Connection refused not connected> exit
何故なのか?
原因判明
原因は気付いたらそりゃそうかって感じだけれど、volumesでマウントしていたredisのファイル(dump.rdb)にあった。latestと3.2.12ではredisのバージョンによってファイルのフォーマットに互換性がないため、latestのときに作られたファイルを3.2.12で読もうとしてエラーになって起動できないでいたのだ。
dump.rdbを削除してdocker-composeで起動したところ、redisに接続できた。
教訓
dockerのミドルウェアのメジャーバージョンを変更したらファイルを消すこと!(消しても問題なければ)