Docker Compose Redis healthcheck設定 - アプリの起動順序を保証する

問題

depends_onだけを設定すると、Redisコンテナが「起動した」ことしか保証されず、「準備できた」ことは保証されません。Redisがまだ初期化中にアプリが接続を試みると、Connection refusedエラーが発生します。

解決方法

services:
  app:
    build: .
    depends_on:
      redis:
        condition: service_healthy  # healthyの時のみ起動
    environment:
      - REDIS_URL=redis://redis:6379

  redis:
    image: redis/redis-stack:latest
    environment:
      - REDIS_ARGS=--maxmemory 512mb --maxmemory-policy allkeys-lru
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    volumes:
      - redis-data:/data
    deploy:
      resources:
        limits:
          memory: 768M

volumes:
  redis-data:

ポイント

  • redis-cli pingPONGを返せばhealthy状態になります。start_period: 30sはコンテナ起動後30秒間は失敗してもunhealthyとマークしません。
  • --maxmemory-policy allkeys-lruはメモリがいっぱいになると最も古いキーから自動削除します。キャッシュ用途なら最も無難なポリシーです。
  • deploy.resources.limits.memoryでRedisがホストメモリを使い切るのも防止します。maxmemoryとは別に、コンテナレベルでも制限をかけるのが安全です。