はじめに
最近、チャットアプリの自宅運用の環境整備を粛々と進めています。
チャットアプリは、フロント(Next.js)、バックエンド(Spring-Boot)、DB(DynamoDBローカル)の構成。
当初、DynamoDBローカルは、以下公式のdocker-compose.yml を使って起動していました。
上記だと、データが格納されるファイル「shared-local-instance.db」が、docker-compose.yaml直下の「docker\dynamodb」に作られる。
そうすると、GITコミット時、邪魔になりました。(※ ignoreすれば良いだけなんですけどね。)
そこで、Docker Voulume を使おう!って思い、以下のように書き換えて、ハマったことを残します。
書き換えた内容
Docker Voulumeを使うように変更
~ 中略 ~
volumes:
- dynamodb_data:/home/dynamodblocal/data
~ 中略 ~
volumes:
dynamodb_data:
ハマったこと
Dockerを起動して、NoSQL Workbenchから接続しようとすると、エラーになる。
WARNING: [sqlite] cannot open DB[2]: com.almworks.sqlite4java.SQLiteException: [14] unable to open database file
なに、ファイルが開けない?だと?
調べてみたところ
以下のスタックトレースに辿り着く。
原因
起動したDynamoDBのコンテナ内に入り、idコマンドを実行してみると。ふむふむ、1000(dynamodblocal) か。
sh-5.2$ id
uid=1000(dynamodblocal) gid=1000(dynamodblocal) groups=1000(dynamodblocal)
99%一緒だと思いつつ、DynamoDBを起動しているユーザを見たいけど、psコマンドが無い。
Geminiに相談して、以下の手順で確認し、やはり、1000(dynamodblocal)。
sh-5.2$ ls /proc | grep -E '^[0-9]+$' ★ プロセス確認
1
60
71
72
sh-5.2$ cat /proc/1/cmdline ★ プロセスが実行しているコマンド
java-jarDynamoDBLocal.jar-sharedDb-dbPath./datash-5.2$
sh-5.2$ cat /proc/1/status ★ プロセスの詳細
Name: java
Umask: 0022
~ 中略 ~
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
~ 中略 ~
sh-5.2$
で、「shared-local-instance.db」が格納されている「data」フォルダの権限を見てみると。
「root」。しかも「drwxr-xr-x」なので所有者以外は、書き込みができない。
sh-5.2$ ls -latr
total 9588
~ 中略 ~
drwxr-xr-x 2 root root 12288 Dec 23 11:33 DynamoDBLocal_lib
-rw-r--r-- 1 root root 9720377 Dec 23 11:33 DynamoDBLocal.jar
drwxr-xr-x 1 root root 4096 Dec 23 11:59 ..
drwxr-xr-x 2 root root 4096 Jun 22 00:29 data
drwx------ 1 dynamodblocal dynamodblocal 4096 Jun 22 01:28 .
-rw-r--r-- 1 dynamodblocal dynamodblocal 83 Jun 22 01:28 dynamodb-local-metadata.json
sh-5.2$
原因のサマリ
Docker Volumeのディレクトリは、rootが所有で権限も所有者しか書き込めない。
ただ、DynamoDBローカルは、dynamodblocalユーザで起動しているので書き込み権限が無かったと。
一旦の対処法
起動ユーザをrootユーザに変えました。
よくないですが、自宅のローカルということで。
「user: root」で起動ユーザをrootに変更。
本来であれば「data」フォルダの所有者、権限を変更するのが良いと思いました。
(そのうち変えるかもです。)
db:
container_name: hc-dynamodb-db
command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"
image: "amazon/dynamodb-local:latest"
ports:
- "18000:8000"
restart: always
user: root ★ 追加
volumes:
- dynamodb_data:/home/dynamodblocal/data
working_dir: /home/dynamodblocal
networks:
- home_network