開発用にホストOSにDynamoDB Localをダウンロードして起動し、Laradockのworkspaceコンテナ内のLaravelからlocalhost:8000のDynamoDB Localを操作しようとしたら
Failed to connect to localhost port 8000
当たり前ですね…workspaceコンテナのlocalhostはworkspaceコンテナなんですから…。
解決策としてネットワーク上のホストOSのIPを指定することもできるのかもしれないですが、せっかくDocker Composeを使っていて、かつAmazon公式のDynamoDB LocalのDockerイメージもあるので、LaradockのDocker Composeのネットワークに組み込みたいと思います。
docker-compose.ymlに追記
サービス名(「dynamodb_local」の部分)は任意です
# services: の中に追加
dynamodb_local:
image: amazon/dynamodb-local
command: -jar DynamoDBLocal.jar -dbPath ./data -sharedDb
ports:
- "8000:8000"
volumes:
- ./dynamodb/data:/home/dynamodblocal/data
networks:
- backend
解説
command
amazon/dynamodb-localのデフォルトの実行コマンドを見ると-inMemoryオプションが入っていてDBファイルが作成されない、-shareDbオプションが入っていないのでめんどくさい、という感じなのでcommandで上書きします。
-shareDb を入れないとデフォルトだとクレデンシャルごとに別のデータが作成されてややこしいので単一にします。
(GUIから作ったあるはずのテーブルにResourceNotFoundExceptionが出る場合はクレデンシャルが違うDBにアクセスしていて、-shareDbで解決することがあります)
-dbPathでデータ保存ディレクトリを指定し、volumesでマウントすることでデータをコンテナがdownされても永続化するようにします。
ports
portsはホストOSでdynamodb-adminなどを起動したときに便利なので8000:8000で繋げておきます。
networks
networksは指定しないとworkspaceコンテナから繋がりません。DB層のコンテナなのでbackendで良いでしょう。
Laravelから接続
これでworkspaceコンテナで動いているLaravelからエンドポイント設定を
http://dynamodb_local:8000
にすることで繋がるようになります。
ホストからもポートフォワーディングされているのでlocalhost:8000で繋がります。
コメント