ローカルホストでmongodbのトランザクションを使いたいってなったら、レプリカセットを設定しないとダメで、下記のように設定した。
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
depends_on:
- mongodb
environment:
mongodb:
environment:
- AUTH=no
command: [--replSet, my-replica-set, --noauth, --bind_ip_all]
build:
context: .
dockerfile: ./docker/mongodb/DockerFile
ports:
- "27017:27017"
volumes:
- mongodb_data:/data/db
- ./docker/mongodb/init/db_init.js:/db_init.js
restart: always
mongo-express:
image: mongo-express
container_name: mongo_express
restart: always
ports:
- "8081:8081"
environment:
ME_CONFIG_MONGODB_SERVER: mongodb
depends_on:
- mongodb
volumes:
mongodb_data:
# テスト用データベース
TEST_DB_URI=mongodb://localhost:27017/lifelogAppTest
FROM mongo:6.0.6
# エントリーポイントスクリプトを追加
ADD mongo_docker_entrypoint.sh /entrypoint.sh
EXPOSE 27017
# エントリーポイントを設定
ENTRYPOINT ["/entrypoint.sh"]
#!/bin/bash
# MongoDBを起動
mongod --replSet my-replica-set --noauth --bind_ip_all &
# MongoDBが起動するのを待つ
echo "Waiting for MongoDB to start..."
sleep 10
# initスクリプトを実行
mongosh /db_init.js
# コンテナが終了しないように待機
wait
上記だと、dockerネットワーク内ではうまくいくが、レプリカセットを設定するときにdockerネットワーク内の名前で指定しちゃってるので、dockerネットワーク外からlocalhost指定で繋げないってことが起こった。それで外からyarn testで繋げなくて落ちる。
それでtestのたびに
docker-compose upの状態で
$ docker exec -it habitt-api-app-1 /bin/sh
で中に入ってから
yarn test
をやってる。
$ docker exec -it container-mongodb-1 /bin/sh
で、mongoshしてから
var rsconf = rs.conf();
rsconf.members[0].host = "localhost:27017";
rs.reconfig(rsconf, { force: true });
すると、docker-compose外からでもいけるけど、またmongodb:27017に戻さないとダメ。
もっとうまいやり方があったら教えてほしい。