通过docker-compose引导mongoDB

5cg8jx4n  于 2022-12-26  发布在  Docker
关注(0)|答案(2)|浏览(152)

假设我有以下由2个服务组成的Docker组合:一个nodeJS应用程序和一个支持它的mongoDB数据库:

version: "3.8"

services:
  mongodb-local:
    image: mongo:latest
    restart: unless-stopped
    env_file: ./.env
    # see: https://stackoverflow.com/questions/52373098/disable-default-authentication-in-mongo-docker
#    environment:
#      - MONGO_INITDB_ROOT_USERNAME=$MONGODB_USER
#      - MONGO_INITDB_ROOT_PASSWORD=$MONGODB_PASSWORD
#      - MONGO_INITDB_DATABASE=$MONGODB_DATABASE
    ports:
      - "27017:27017"
    volumes:
      - db:/data/db
  app:
    depends_on:
      - mongodb-local
    build: .
    restart: unless-stopped
    env_file: ./.env
    ports:
      - 3000:3000
    environment:
      - DB_HOST=mongodb
      - DB_USER=$MONGODB_USER
      - DB_PASSWORD=$MONGODB_PASSWORD
      - DB_NAME=$MONGODB_DATABASE
      - DB_PORT=$MONGODB_DOCKER_PORT
    stdin_open: true
    tty: true

假设nodeJS代码使用mongoose来引导所有模式和模型,这样一旦nodeJS应用程序启动,我就可以点击特定的端点来注册用户、添加一些数据等。
我现在要做的是能够“播种”数据库,以便“在启动时”创建用户和/或添加数据,以便在执行以下操作时:docker-compose up我将获得一个“种子”数据库,该应用程序可用于本地开发。
现在它是一个2步的过程:
1.运行docker-composite up以加快两个服务的速度
1.通过postman对nodeJS应用程序运行curl命令,通过让mongoose“工作”来播种DB。
我想要的是一种机制,在立即进行停靠组合时,用一些测试数据“播种”DB。
我试着像这样使用 curl 图像:

version: "3.8"

services:
  mongodb-local:
    image: mongo:latest
    restart: unless-stopped
    env_file: ./.env
    # see: https://stackoverflow.com/questions/52373098/disable-default-authentication-in-mongo-docker
#    environment:
#      - MONGO_INITDB_ROOT_USERNAME=$MONGODB_USER
#      - MONGO_INITDB_ROOT_PASSWORD=$MONGODB_PASSWORD
#      - MONGO_INITDB_DATABASE=$MONGODB_DATABASE
    ports:
      - "27017:27017"
    volumes:
      - db:/data/db
  app:
    depends_on:
      - mongodb-local
    build: .
    restart: unless-stopped
    env_file: ./.env
    ports:
      - 3000:3000
    environment:
      - DB_HOST=mongodb
      - DB_USER=$MONGODB_USER
      - DB_PASSWORD=$MONGODB_PASSWORD
      - DB_NAME=$MONGODB_DATABASE
      - DB_PORT=$MONGODB_DOCKER_PORT
    stdin_open: true
    tty: true

  curl-run:
    depends_on:
      - mongodb-local
      - app
    image: curlimages/curl
    command: "sleep 20 && curl --location --request POST 'http://localhost:3000/register' \
      --header 'Content-Type: application/json' \
      --data-raw '{\
      'username': 'user',\
      'password': 'pass',\
      'role': 'admin'\
    }'"

volumes:
  db:

但是,运气不好...任何指点都将不胜感激。
我读过关于mongodumprestore的文章,但没有成功。
请注意,如果有一种方法可以直接通过卷或直接对DB容器执行此操作,那将是最好的方法!
先谢了!

oaxa6hgo

oaxa6hgo1#

您是否尝试过使用/docker-entrypoint-initdb.d
来自文档:
当一个容器第一次启动时,它将执行扩展名为. sh和. js的文件,这些文件位于/docker-entrypoint-initdb. d中。文件将按字母顺序执行。. js文件将由mongosh(mongo 6以下版本)使用MONGO_INITDB_DATABASE变量指定的数据库(如果存在)执行,或者进行其他测试。您也可以在. js脚本中切换数据库。
我在这里看到的唯一警告是,这可能只适用于一个新的构建(docker-compose up -b),而不是每次启动它时。如果你不关心在上下运行之间保留数据,这应该会起作用。

bis0qfac

bis0qfac2#

我设法通过调整mongo图像入口点来解决这个问题:第一个月
实际上,我复制了一个Javascript格式的init文件,该文件通过卷配置被复制到容器入口点,并在启动时执行,这使我能够实现我想要的:启动时用数据播种数据库!
下面是我为mongoDB修改的docker服务:

services:
  mongodb-local:
    image: mongo:latest
    restart: unless-stopped
    env_file: ./.env
    ports:
      - "27017:27017"
    volumes:
      - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
      - db:/data/db

下面是我的实际“种子”文件:

print('Start #################################################################');

db = db.getSiblingDB('<some db name>');

console.log(db)

db.createCollection('<a collection>');

db.dams.insertMany([ ....]);

....

print("End #########")

相关问题