背景
背景というほどのこともないんですが、タイトルままでDockerのRedisに初期データを登録したくて、その方法が検索しても出てこず試行錯誤してできたので備忘録的な感じです。
MySQLなんかは /docker-entrypoint-initdb.d
にSQL書いたファイルをマウントすればコンテナ起動時にSQL実行されるのでテーブル作って初期データ作ったりできますね。
Redisの場合は、同じ要領ではできないので、初期データ登録するだけですぐ落ちるコンテナを作ることで対応しました。
やり方
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
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もいけるんじゃないか?」と試してみたところ、ようやくうまくいったのでした。
そして勢いそのままにこの記事を書いているのでした。