【问题标题】:Insert Data Into MongoDB Container at the Spring Boot Application initialization在 Spring Boot 应用程序初始化时将数据插入 MongoDB 容器
【发布时间】:2021-08-15 08:02:09
【问题描述】:

当应用程序开始运行时,我必须在 MongoDB 中的 Collection 中插入一些示例数据。我已经完成了以下步骤,但没有成功。

  1. 在 init_script 文件夹下创建了entrypoint.js

entrypoint.js

 use admin;

db.createUser(
    {
        user: "patient_db",
        pwd: "14292",
        roles: [ { role: "readWrite", db: "patient_db" } ]
    }
);

db.grantRolesToUser( "patient_db", [{ role: "readWrite", db: "patient_db"}]); 
  1. 在资源路径中创建了data.js 文件

src/main/resources/data.js

use patient_db;

db.createCollection("holiday");

db.holiday.insert({holiday_date:'25-12-2021',holiday_name:'Christmas',created_by:'John Wick',modified_by:'John_Wick',created_date_time:'2021-04-25 04:23:55',modified_date_time:'2021-04-25 04:23:55'});
  1. 配置了 docker-compose.yml

docker-compose.yml

 version: "3"

services:
  patient-service:
    image: patient-service:1.0
    container_name: patient-service
    ports:
    - 9090:9090
    restart: on-failure
    networks:
      - patient-mongo
    depends_on:
      - mongo-db
    links:
      - mysql-db
  mongo-db:
    image: mongo:latest
    container_name: mongo-db
    ports:
      - 27017:27017
    networks:
      - patient-mongo
    volumes:
     - 'mongodata:/data/db'
     - './init_scripts:/docker-entrypoint-initdb.d' 
    environment:
     - MONGO_INITDB_ROOT_USERNAME=admin
     - MONGO_INITDB_ROOT_PASSWORD=14292
    restart: unless-stopped
    

networks:
  patient-mongo:
  
volumes:
  mongodata:

4.最后,连接MongoDB

properties-dev.yml

spring:
    data:
      mongodb:
        host: mongo-db
        port: 27017
        database: patient_db

【问题讨论】:

  • 我在问 MongoDB 容器。在关于本地机器上托管的本地 MongoDB 的问题中
  • 如果数据库运行在容器中,或者在同一个系统上,或者在云中,应该没有什么不同;虽然@RandyCasburn 提到的问题没有很多细节,但我希望那里的整体技术也可以在基于 Docker 的设置中工作。

标签: java mongodb spring-boot docker docker-compose


【解决方案1】:

这就是我将入口点代码插入 mongodb 容器的方式:

  1. 创建一个 .sh 文件(example.sh)
  2. 创建 mongo 用户和要插入的数据。

example.sh

#!/usr/bin/env bash
echo "Creating mongo users..."
mongo admin --host localhost -u root -p mypass --eval "

db = db.getSiblingDB('patient_db');
db.createUser(
 {
    user: "patient_db",
    pwd: "14292",
    roles: [ { role: "readWrite", db: "patient_db" } ]
 }
);
 db.createCollection('holiday');

db.holiday.insert({holiday_date:'25-12-2021',holiday_name:'Christmas',
created_by:'John Wick',modified_by:'John_Wick',created_date_time:'2021-04-25 04:23:55',modified_date_time:'2021-04-25 04:23:55'});

"

echo "Mongo users and data created."
  1. 在 docker-compose 中,插入入口点

    volumes:
    - 'mongodata:/data/db'
    - './example.sh:/docker-entrypoint-initdb.d/example.sh'
    

也许它不是更干净的选择,但它可以完美地工作。

我这样做是因为我没有让它与 js 文件一起使用。

【讨论】:

    【解决方案2】:

    感谢@Schwarz54 的回答。它适用于js 文件

    init_scripts/mongo_init.js

    var db = connect("mongodb://admin:14292@127.0.0.1:27017/admin");
    
    db = db.getSiblingDB('patient_db'); /* 'use' statement doesn't support here to switch db */
    
    db.createUser(
        {
            user: "patient_db",
            pwd: "14292",
            roles: [ { role: "readWrite", db: "patient_db" } ]
        }
    );
    
    
    db.createCollection("holiday");
    
    db.holiday.insert({holiday_date:'25-12-2021',holiday_name:'Christmas',created_by:'John Wick',modified_by:'John_Wick',created_date_time:'2021-04-25 04:23:55',modified_date_time:'2021-04-25 04:23:55'});
    

    docker-compose.yml

    volumes:
         - 'mongodata:/data/db'
         - './init_scripts:/docker-entrypoint-initdb.d' 
    

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 1970-01-01
      • 2018-02-14
      • 2021-06-22
      • 2018-11-13
      • 2018-03-22
      • 2021-11-05
      • 2019-09-06
      • 1970-01-01
      相关资源
      最近更新 更多