LoginSignup
1
0

DockerのRedisに初期データを登録する

Posted at

背景

背景というほどのこともないんですが、タイトルままでDockerのRedisに初期データを登録したくて、その方法が検索しても出てこず試行錯誤してできたので備忘録的な感じです。

MySQLなんかは /docker-entrypoint-initdb.d にSQL書いたファイルをマウントすればコンテナ起動時にSQL実行されるのでテーブル作って初期データ作ったりできますね。
Redisの場合は、同じ要領ではできないので、初期データ登録するだけですぐ落ちるコンテナを作ることで対応しました。

やり方

compose.yaml
version: "3.9"

services:
  redis:
    image: redis:latest

  redis-client:
    image: redis:latest
    volumes:
      - ./redis/redis-init-data.txt:/tmp/redis-init-data.txt
    command: >
      /bin/bash -c '
      cat /tmp/redis-init-data.txt | redis-cli -h redis -p 6379 --pipe
      '
    depends_on:
      - redis
redis/redis-init-data.txt
SET test-key test-value

redisコンテナは、アプリやら何やらが接続して実際に使うコンテナです。
redis-clientコンテナは、redisコンテナに初期データを登録したらお役御免のコンテナです。

redis-init-data.txtファイルに登録したい初期データ(redisコマンド)を書いておいて、それを初期データ登録用のredis-clientコンテナにマウントします。

redis-clientコンテナは redis-cliコマンドで、マウントされたファイルの内容をredisコンテナに対して実行します。
これでredisコンテナに初期データが登録されます。

こんな感じで。

ターミナル
$ docker compose exec redis bash
root@4a5eb2d1a95d:/data# redis-cli get test-key
"test-value"

redis-clientコンテナはこのコマンドを実行した後、落ちます。

cat /tmp/redis-init-data.txt | redis-cli -h redis -p 6379 --pipe

ただの苦労話

元々1つのredisコンテナでなんとかできないか色々試してたんですが、docker-composeファイルのcommandの中でredis-cliコマンドを使うと、コンテナがexited(0)で正常終了してしまってお手上げ状態でした。
調べても出てこないし、ChatGPTもGeminiも、これといった回答が出ず、諦めて全く関係ない件の環境構築の方法を調べてる中で、クライアント用のコンテナを立てるという手法を見て、「このやり方ならもしかしてRedisもいけるんじゃないか?」と試してみたところ、ようやくうまくいったのでした。
そして勢いそのままにこの記事を書いているのでした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0