0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DynamoDBローカルでDocker Voulumeを使おうとしてちょっとハマった話

Posted at

はじめに

最近、チャットアプリの自宅運用の環境整備を粛々と進めています。

チャットアプリは、フロント(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
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?