【问题标题】:Docker: MongoDB init script: read value from .env fileDocker:MongoDB 初始化脚本:从 .env 文件中读取值
【发布时间】:2021-03-18 21:21:01
【问题描述】:

如何读取mongo-init.js 中的环境变量? docker-compose.yml 能够从 .env 文件中读取,但 mongo-init.js 不能,因为 mongo-init.js 将复制到 /docker-entrypoint-initdb.d 卷(不确定我是对还是错)。这意味着mongo-init.jsprocess.env.MONGODB_USERNAME 读作undefined

是否可以在复制到/docker-entrypoint-initdb.d之前先将mongo-init.js中的env值转换为/docker-entrypoint-initdb.d

docker-compose.yml

version: '2'

services:
  mongodb:
    image: mongo:4.4.2
    restart: always
    container_name: local-mongodb
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${MONGODB_ROOT_USERNAME}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGODB_ROOT_PASSWORD}
    ports:
      - ${MONGODB_PORT}:27017
    volumes:
      - mongodb_database:/data/db
      - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js

volumes:
  mongodb_data:

mongo-init.js

require('dotenv').config()

print('mongo init start --------------------');

const pms = db.getSiblingDB(process.env.MONGODB_DATABASE)

pms.createUser({
  user: process.env.MONGODB_USERNAME,
  pwd: process.env.MONGODB_PASSWORD,
  roles: [
    {
      role: 'readWrite',
      db: process.env.MONGODB_DATABASE,
    },
  ],
});

print('mongo init end --------------------');

.env

MONGODB_ROOT_USERNAME=root
MONGODB_ROOT_PASSWORD=password
MONGODB_DATABASE=product
MONGODB_USERNAME=user
MONGODB_PASSWORD=password
MONGODB_PORT=27017

【问题讨论】:

    标签: node.js database mongodb docker docker-compose


    【解决方案1】:

    我相信以优雅的方式实现您想要的最佳方式是使用direnv

    解决方案

    建议的解决方案使用以下文件:

    • Dotenv 文件.env
    • 目录文件.envrc
    • Docker 撰写文件docker-compose.yml
    • 创建 Mongo 初始化脚本create_mongo_init.sh
    • 启动脚本up.sh

    目录

    首先确保您已安装direnv

    Docker 编写文件

    编辑docker-compose.yml文件并确保它如下:

    version: '3.7'
    
    services:
        mongo:
            image: mongo:latest
            restart: always
            environment:
                MONGO_INITDB_ROOT_USERNAME: ${DB_USERNAME}
                MONGO_INITDB_ROOT_PASSWORD: ${DB_PASSWORD}
                MONGO_INITDB_DATABASE: ${DB_NAME}
            ports:
                - '27017-27019:27017-27019'
            volumes:
                - mongodb_database:/data/db
                - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
    

    .env 文件创建

    创建.env文件并输入:

    DB_USERNAME=username
    DB_PASSWORD=password
    DB_NAME=db_name
    

    .envrc 文件创建

    在终端输入:

    echo dotenv > .envrc
    

    你应该看到如下输出:

    direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
    

    加载环境变量

    所以输入你的终端:

    direnv allow .
    

    如果你的 Direv 安装没问题,它会加载变量并输出以下内容:

    direnv: loading .envrc                                                                               
    direnv: export +DB_NAME +DB_PASSWORD +DB_USERNAME
    

    Mongo 初始化脚本

    使用以下内容创建一个名为 create_mongo_init.sh 的文件:

    #!/bin/sh
    
    echo "\
    print('mongo init start --------------------'); \n\
    \n\
    db.createUser( \n\
        { \n\
            user: \"$DB_USERNAME\", \n\
            pwd: \"$DB_PASSWORD\", \n\
            roles: [ \n\
                { \n\
                    role: \"readWrite\", \n\
                    db: \"$DB_NAME\" \n\
                } \n\
            ] \n\
        } \n\
    ) \n\
    \n\
    print('mongo init end ----------------------'); \n\
    " > mongo-init.js
    

    启动脚本

    创建一个名为up.sh 的文件,内容如下:

    #!/bin/sh
    
    ./create_mongo_init.sh
    docker-compose up -d
    rm mongo-init.js # Delete initialization script to avoid credentials leakage.
    

    然后通过输入运行它:

    . ./up.sh
    

    【讨论】:

      【解决方案2】:

      这将帮助某人!

      Docker-compose.yml

      version: "3.3"
      services:
        mongo:
          image: mongo
          restart: always
          ports:
            - 27017:27017
          environment:
            MONGO_INITDB_ROOT_USERNAME: myuser
            MONGO_INITDB_ROOT_PASSWORD: mypass
            MONGO_URI: ${MONGO_URI}
            MONGO_USER: ${MONGO_USER}
            MONGO_PWD: ${MONGO_PWD}
            MONGO_DB_NAME: ${MONGO_DB_NAME}
            MONGO_URI_TEST: ${MONGO_URI_TEST}
            MONGO_USER_TEST: ${MONGO_USER_TEST}
            MONGO_PWD_TEST: ${MONGO_PWD_TEST}
            MONGO_DB_NAME_TEST: ${MONGO_DB_NAME_TEST}
            MONGO_URI_DOCKER: ${MONGO_URI_DOCKER}
            MONGO_USER_DOCKER: ${MONGO_USER_DOCKER}
            MONGO_PWD_DOCKER: ${MONGO_PWD_DOCKER}
            MONGO_DB_NAME_DOCKER: ${MONGO_DB_NAME_DOCKER}
          volumes:
            - ./volume/mongo-data:/data/db
            - ./mongo-init:/docker-entrypoint-initdb.d/:ro
            
      

      mongo-entrypoint.sh

      echo '################ MONGO ENTRYPOINT START ################';
      
      mongo -- "$MONGO_INITDB_DATABASE" <<EOF
      db = db.getSiblingDB('$MONGO_DB_NAME_DOCKER');
      db.createUser(
        {
          user: '$MONGO_USER_DOCKER',
          pwd: '$MONGO_PWD_DOCKER',
          roles: [{ role: 'readWrite', db: '$MONGO_DB_NAME_DOCKER' }],
        },
      );
      db.createCollection('users');
      
      db = db.getSiblingDB('$MONGO_DB_NAME');
      db.createUser(
        {
          user: '$MONGO_USER',
          pwd: '$MONGO_PWD',
          roles: [{ role: 'readWrite', db: '$MONGO_DB_NAME' }],
        },
      );
      db.createCollection('users');
      
      db = db.getSiblingDB('$MONGO_DB_NAME_TEST');
      db.createUser(
        {
          user: '$MONGO_USER_TEST',
          pwd: '$MONGO_PWD_TEST',
          roles: [{ role: 'readWrite', db: '$MONGO_DB_NAME_TEST' },{ role: 'dbAdmin', db: '$MONGO_DB_NAME_TEST' }],
        },
      );
      db.createCollection('users');
      EOF
      
      echo '################ MONGO ENTRYPOINT END ################';
      

      .env

      MONGO_URI="mongodb://localhost:27017/vinsys_db_dev"
      MONGO_USER='fancyuser'
      MONGO_PWD='fancypass'
      MONGO_DB_NAME='vinsys_db_dev'
      
      MONGO_URI_TEST="mongodb://localhost:27017/vinsys_db_test"
      MONGO_USER_TEST='fancyuser'
      MONGO_PWD_TEST='fancypass'
      MONGO_DB_NAME_TEST='vinsys_db_test'
      
      MONGO_URI_DOCKER="mongodb://mongo:27017/vinsys_db_prod"
      MONGO_USER_DOCKER='fancyuser'
      MONGO_PWD_DOCKER='fancypass'
      MONGO_DB_NAME_DOCKER='vinsys_db_prod'
      

      【讨论】:

        猜你喜欢
        • 2022-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 1970-01-01
        • 2017-09-01
        • 2011-10-19
        • 1970-01-01
        相关资源
        最近更新 更多