patorashのブログ

方向性はまだない

docker-composeで起動したredisに繋がらなかった。

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のミドルウェアのメジャーバージョンを変更したらファイルを消すこと!(消しても問題なければ)