この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
表題の件についてのメモ
背景
- Rails アプリケーションのローカル開発環境を Docker で構築
- その環境には Sidekiq の worker が稼働する、
worker
コンテナ、Sidekiqがバックエンドとして使用している Redis が稼働しているredis
コンテナが存在する
現象
docker-compose
によるコンテナの立ち上げ時、以下のエラーが発生して worker
コンテナが落ちる
worker | LOADING Redis is loading the dataset in memory
worker | /app/vendor/bundle/ruby/2.5.0/gems/redis-4.0.3/lib/redis/client.rb:124:in `call'
worker | /app/vendor/bundle/ruby/2.5.0/gems/redis-4.0.3/lib/redis/client.rb:107:in `block in connect'
(略)
worker | /app/vendor/bundle/ruby/2.5.0/gems/redis-4.0.3/lib/redis.rb:278:in `info'
worker | /app/vendor/bundle/ruby/2.5.0/gems/sidekiq-5.2.3/lib/sidekiq.rb:113:in `block in redis_info'
worker | /app/vendor/bundle/ruby/2.5.0/gems/sidekiq-5.2.3/lib/sidekiq.rb:95:in `block in redis'
原因
redis
コンテナ起動時に --appendonly yes
が指定されていた。
LOADING Redis is loading the dataset in memory
というエラーは、 AOF(Append-only File)からデータをメモリ上に展開している間に更新(SET)などのコマンドを実行しようとした際に発生するらしい。
RDB/AOFファイルをローディングしている間、SETコマンドのようなものを実行すれば “(error)LOADING Redis is loading the dataset in memory”このようなエラーを出すが、infoコマンドは実行されます。 したがって、infoコマンドでローディング中なのか確認することができます。
REDIS INFO [section] コマンド
対処その1
Append-only File は、プロセスの予期しない終了等からデータを保護するための機構であるが、ローカル開発環境においてはそのような考慮は不要(消えても構わない)ので、 --amendonly yes
オプションを取り除く。
redis:
image: redis:latest
ports:
- 6379:6379
volumes:
- redis:/data
- command: redis-server --appendonly yes
+ command: redis-server
対処その2
あるいは、ローカルで保持しているRedis内の情報が消えても構わないのであれば一旦 redis
コンテナに割り当てている Volume を削除してあげるという方法もある。
ただし、一時的なものなので AOF が肥大化するにつれていずれ問題が再発する。(と思われる)
ボリュームを削除する手順は以下(コンテナを停止している状態で実施する)
<ボリュームの一覧確認>
docker volume ls
<ボリューム削除>
docker volume rm xxxxxx_redis