복붙노트

[MONGODB] 시작에 어떻게 MongoDB를 컨테이너에 대한 DB를 만드는 방법?

MONGODB

시작에 어떻게 MongoDB를 컨테이너에 대한 DB를 만드는 방법?

나는 부두 노동자로 일하고 나는 PHP, MySQL은, 아파치와 레디 스와 스택이있다. 나는 최신 버전 또한 MongoDB를 Dockerhub에서 docker-entrypoint.sh 파일의 Dockerfile을 확인 그래서 지금 MongoDB를 추가 할 필요하지만 난 설정에 방법의 기본 DB, 관리자 사용자 / 암호 가능성이 인증을 찾을 수 없습니다 고정 표시기 - compose.yml 파일에서 컨테이너 방법.

당신은 설정 예를 들어 같은 일부 ENV 변수 수 MySQL의에서 :

db:
    image: mysql:5.7
    env_file: .env
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

그리고이 뜻을 설정 DB를하고 루트 암호와 사용자 / 암호를 입력합니다.

MongoDB를 가진 동일한을 달성 할 수있는 방법이 있습니까? 누구나 어떤 경험이나 해결 방법이있다?

해결법

  1. ==============================

    1.공식 몽고 이미지가 시작할 때 사용자와 데이터베이스를 만들 수있는 기능을 포함하도록 홍보를 합병했다.

    공식 몽고 이미지가 시작할 때 사용자와 데이터베이스를 만들 수있는 기능을 포함하도록 홍보를 합병했다.

    은 / 데이터 / DB 디렉토리에 채워 아무것도 없을 때 데이터베이스 초기화가 실행됩니다.

    제어 "루트"사용자 설정에 대한 환경 변수는

    docker run -d \
      -e MONGO_INITDB_ROOT_USERNAME=admin \
      -e MONGO_INITDB_ROOT_PASSWORD=password \
      mongod
    

    고정 표시기의 entrypoint.sh 스크립트는 환경 변수가 존재하는 경우이 추가로 / 명령 행에 --auth 사용할 수 없습니다에 당신은 필요가 없습니다.

    이미지는 배포 정의의 .js 또는 데이터베이스의 초기화에 한 번 실행됩니다 .sh로 설치 스크립트에 /docker-entrypoint-initdb.d/ 경로를 제공합니다. 환경에 정의 된 경우의 .js 스크립트는 기본 또는 MONGO_INITDB_DATABASE으로 테스트에 대해 실행됩니다.

    COPY mysetup.sh /docker-entrypoint-initdb.d/
    

    또는

    COPY mysetup.js /docker-entrypoint-initdb.d/
    

    (결과 확인 용) 오류와 함께 종료 로깅 방법을 보여줍니다 간단한 초기화 자바 스크립트 파일.

    let error = true
    
    let res = [
      db.container.drop(),
      db.container.drop(),
      db.container.createIndex({ myfield: 1 }, { unique: true }),
      db.container.createIndex({ thatfield: 1 }),
      db.container.createIndex({ thatfield: 1 }),
      db.container.insert({ myfield: 'hello', thatfield: 'testing' }),
      db.container.insert({ myfield: 'hello2', thatfield: 'testing' }),
      db.container.insert({ myfield: 'hello3', thatfield: 'testing' }),
      db.container.insert({ myfield: 'hello3', thatfield: 'testing' }),
    ]
    
    printjson(res)
    
    if (error) {
      print('Error, exiting')
      quit(1)
    }
    
  2. ==============================

    2.여기에 고정 표시기-작성과 JS 스크립트를 사용하여 다른 청소기 솔루션입니다.

    여기에 고정 표시기-작성과 JS 스크립트를 사용하여 다른 청소기 솔루션입니다.

    이 예는 두 파일 (고정 표시기-compose.yml과 몽고-init.js로는) 같은 폴더에 누워 있다고 가정합니다.

    version: '3.7'
    
    services:
        mongodb:
            image: mongo:latest
            container_name: mongodb
            restart: always
            environment:
                MONGO_INITDB_ROOT_USERNAME: <admin-user>
                MONGO_INITDB_ROOT_PASSWORD: <admin-password>
                MONGO_INITDB_DATABASE: <database to create>
            ports:
                - 27017:27017
            volumes:
                - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
    
    db.createUser(
            {
                user: "<user for database which shall be created>",
                pwd: "<password of user>",
                roles: [
                    {
                        role: "readWrite",
                        db: "<database to create>"
                    }
                ]
            }
    );
    

    그리고 간단하게 다음과 같은 고정 표시기-작성 명령을 실행하여 서비스를 시작합니다

    docker-compose up --build -d mongodb 
    
  3. ==============================

    3.여기에 해당 데이터베이스에 암호, 추가 데이터베이스 (테스트 DB) 및 테스트 - 사용자와 관리자 사용자 사용자를 생성하는 작업 솔루션이다.

    여기에 해당 데이터베이스에 암호, 추가 데이터베이스 (테스트 DB) 및 테스트 - 사용자와 관리자 사용자 사용자를 생성하는 작업 솔루션이다.

    Dockerfile :

    FROM mongo:4.0.3
    
    ENV MONGO_INITDB_ROOT_USERNAME admin-user
    ENV MONGO_INITDB_ROOT_PASSWORD admin-password
    ENV MONGO_INITDB_DATABASE admin
    
    ADD mongo-init.js /docker-entrypoint-initdb.d/
    

    몽고-init.js로 :

    db.auth('admin-user', 'admin-password')
    
    db = db.getSiblingDB('test-database')
    
    db.createUser({
      user: 'test-user',
      pwd: 'test-password',
      roles: [
        {
          role: 'root',
          db: 'admin',
        },
      ],
    });
    

    까다로운 부분은 *의 .js 파일이 인증되지 않은 실행 된 것을 이해하는 것이 었습니다. 이 솔루션은 관리자 데이터베이스 관리자 사용자로 스크립트를 인증합니다. MONGO_INITDB_DATABASE 관리자는, 그렇지 않으면 스크립트는 테스트 DB에 대해 필수 실행될 것입니다. docker-entrypoint.sh의 소스 코드를 확인합니다.

  4. ==============================

    4.경우에는 누군가가 고정 표시기-작성을 사용하여 인증 MongoDB를 구성하는 방법을 찾고, 여기에 환경 변수를 사용하여 샘플 구성은 다음과 같습니다

    경우에는 누군가가 고정 표시기-작성을 사용하여 인증 MongoDB를 구성하는 방법을 찾고, 여기에 환경 변수를 사용하여 샘플 구성은 다음과 같습니다

    version: "3.3"
    
    services:
    
      db:
          image: mongo
          environment:
            - MONGO_INITDB_ROOT_USERNAME=admin
            - MONGO_INITDB_ROOT_PASSWORD=<YOUR_PASSWORD>
          ports:
            - "27017:27017"
    

    당신의 몽고 인스턴스까지 고정 표시기-편지 쓰기를 실행할 때 인증이 활성화 자동으로 실행됩니다. 당신은 지정된 패스워드를 가진 관리자 데이터베이스가됩니다.

  5. ==============================

    5.몽고 이미지 MONGO_INITDB_DATABASE 변수에 의해 영향을받을 수 있지만, 데이터베이스를 작성하지 않습니다. /docker-entrypoint-initdb.d/* 스크립트를 실행하는 경우이 변수는 현재 데이터베이스를 결정합니다. 당신이 몽고에 의해 실행 스크립트에서 환경 변수를 사용할 수 없기 때문에, 나는 쉘 스크립트로했다 :

    몽고 이미지 MONGO_INITDB_DATABASE 변수에 의해 영향을받을 수 있지만, 데이터베이스를 작성하지 않습니다. /docker-entrypoint-initdb.d/* 스크립트를 실행하는 경우이 변수는 현재 데이터베이스를 결정합니다. 당신이 몽고에 의해 실행 스크립트에서 환경 변수를 사용할 수 없기 때문에, 나는 쉘 스크립트로했다 :

    도커-swarm.yml :

    version: '3.1'
    
    secrets:
      mongo-root-passwd:
        file: mongo-root-passwd
      mongo-user-passwd:
        file: mongo-user-passwd
    
    services:
      mongo:
        image: mongo:3.2
        environment:
          MONGO_INITDB_ROOT_USERNAME: $MONGO_ROOT_USER
          MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/mongo-root-passwd
          MONGO_INITDB_USERNAME: $MONGO_USER
          MONGO_INITDB_PASSWORD_FILE: /run/secrets/mongo-user-passwd
          MONGO_INITDB_DATABASE: $MONGO_DB
        volumes:
          - ./init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh
        secrets:
          - mongo-root-passwd
          - mongo-user-passwd
    

    init-mongo.sh:

    mongo -- "$MONGO_INITDB_DATABASE" <<EOF
        var rootUser = '$MONGO_INITDB_ROOT_USERNAME';
        var rootPassword = '$(cat "$MONGO_INITDB_ROOT_PASSWORD_FILE")';
        var admin = db.getSiblingDB('admin');
        admin.auth(rootUser, rootPassword);
    
        var user = '$MONGO_INITDB_USERNAME';
        var passwd = '$(cat "$MONGO_INITDB_PASSWORD_FILE")';
        db.createUser({user: user, pwd: passwd, roles: ["readWrite"]});
    EOF
    

    또는, CONFIGS에 init-mongo.sh 저장 (고정 표시기의 설정 생성)와 함께 마운트 할 수 있습니다 :

    configs:
        init-mongo.sh:
            external: true
    ...
    services:
        mongo:
            ...
            configs:
                - source: init-mongo.sh
                  target: /docker-entrypoint-initdb.d/init-mongo.sh
    

    그리고 비밀 파일에 저장되지 수 있습니다.

  6. ==============================

    6.당신이 당신의에서 사용자 이름과 암호를 제거하기 위해 찾고 있다면 여기에 내가 접근 한 방법입니다, 당신은 도커 비밀을 사용하여 고정 표시기 - compose.yml.

    당신이 당신의에서 사용자 이름과 암호를 제거하기 위해 찾고 있다면 여기에 내가 접근 한 방법입니다, 당신은 도커 비밀을 사용하여 고정 표시기 - compose.yml.

    version: '3.6'
    
    services:
      db:
        image: mongo:3
        container_name: mycontainer
      secrets:
        - MONGO_INITDB_ROOT_USERNAME
        - MONGO_INITDB_ROOT_PASSWORD
      environment:
        - MONGO_INITDB_ROOT_USERNAME_FILE=/var/run/secrets/MONGO_INITDB_ROOT_USERNAME
        - MONGO_INITDB_ROOT_PASSWORD_FILE=/var/run/secrets/MONGO_INITDB_ROOT_PASSWORD
    secrets:
      MONGO_INITDB_ROOT_USERNAME:
        file:  secrets/${NODE_ENV}_mongo_root_username.txt
      MONGO_INITDB_ROOT_PASSWORD:
        file:  secrets/${NODE_ENV}_mongo_root_password.txt
    

    당신이 외부 사용할 수 있지만 내 비밀에 대한 옵션 :와 떼에서 비밀을 사용 나는 파일을 사용할 수 있습니다.

    비밀은 / var에 / 실행 / 비밀의 용기에 모든 스크립트 사용할 수 있습니다

    도커 문서는 중요한 데이터를 저장에 대해 이런 말을했습니다 ...

    https://docs.docker.com/engine/swarm/secrets/

    당신은 런타임에 컨테이너 필요하지만, 당신은 같은 이미지 또는 소스 제어에 저장하지 않으 민감한 데이터를 관리하는 비밀을 사용할 수 있습니다 :

    사용자 이름 및 암호 TLS 인증서 및 키 SSH 키 이러한 데이터베이스 또는 내부 서버의 이름과 같은 다른 중요한 데이터 일반 문자열이나 이진 콘텐츠 (최대 크기는 500 KB)

  7. from https://stackoverflow.com/questions/42912755/how-to-create-a-db-for-mongodb-container-on-start-up by cc-by-sa and MIT license