복붙노트

[MONGODB] 어떻게 도커 통해 MongoDB의에 인증을 사용하려면?

MONGODB

어떻게 도커 통해 MongoDB의에 인증을 사용하려면?

나는 MongoDB를위한 스핀 업 고정 표시기를 원하는 : 최신하지만 액세스 특정 DB에 특정 사용자 (들) (들) (즉, --auth 가능) 할 수 있습니다. 어느 누구도 MongoDB를 전혀 접근하지한다! 어떻게 고정 표시기 개시의 일환으로이 작업을 수행해야합니까?

-v / 내 / 자신의 / DATADIR : / 데이터 / DB를 BTW, 데이터 디렉토리는 시작시 다음 명령을 이용하여 호스트에 앉아있다.

해결법

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

    1.당신은 살펴 경우 :

    당신은 살펴 경우 :

    당신은 docker-entrypoint.sh에 사용되는 두 개의 변수가 있다는 것을 알 수 있습니다 :

    당신은 설치 루트 사용자로 사용할 수 있습니다. 예를 들어, 당신은 다음과 같은 고정 표시기-compose.yml 파일을 사용할 수 있습니다 :

    mongo-container:
      image: mongo:3.4.2
      environment:
          # provide your credentials here
          - MONGO_INITDB_ROOT_USERNAME=root
          - MONGO_INITDB_ROOT_PASSWORD=rootPassXXX
      ports:
        - "27017:27017"
      volumes:
          # if you wish to setup additional user accounts specific per DB or with different roles you can use following entry point
        - "$PWD/mongo-entrypoint/:/docker-entrypoint-initdb.d/"
      # no --auth is needed here as presence of username and password add this option automatically
      command: mongod
    

    고정 표시기-작성하여 컨테이너를 시작하는 지금 때 항목을 다음과 같은주의해야까지 :

    ...
    I CONTROL  [initandlisten] options: { net: { bindIp: "127.0.0.1" }, processManagement: { fork: true }, security: { authorization: "enabled" }, systemLog: { destination: "file", path: "/proc/1/fd/1" } }
    ...
    I ACCESS   [conn1] note: no users configured in admin.system.users, allowing localhost access
    ...
    Successfully added user: {
        "user" : "root",
        "roles" : [
            {
                "role" : "root",
                "db" : "admin"
            }
        ]
    }
    

    (이 엔트리 포인트에 고정 표시기-작성에 장착 될 때 $ PWD / 몽고-엔트리 포인트 디렉토리 아래에 위치) 루트 사용의 떨어져 엔트리 포인트 실행 스크립트를 사용자 정의 사용자를 추가하려면 :

    #!/usr/bin/env bash
    echo "Creating mongo users..."
    mongo admin --host localhost -u USER_PREVIOUSLY_DEFINED -p PASS_YOU_PREVIOUSLY_DEFINED --eval "db.createUser({user: 'ANOTHER_USER', pwd: 'PASS', roles: [{role: 'readWrite', db: 'xxx'}]}); db.createUser({user: 'admin', pwd: 'PASS', roles: [{role: 'userAdminAnyDatabase', db: 'admin'}]});"
    echo "Mongo users created."
    

    엔트리 포인트 스크립트가 실행되고 추가 사용자가 생성됩니다.

  2. ==============================

    2.여기에 같은 문제에 대한 한, 그것은 일 것입니다.

    여기에 같은 문제에 대한 한, 그것은 일 것입니다.

  3. ==============================

    3.에이. 당신은 단자를 통해 환경 변수를 사용할 수 있습니다 :

    에이. 당신은 단자를 통해 환경 변수를 사용할 수 있습니다 :

    $ docker run -d --name container_name \
          -e MONGO_INITDB_ROOT_USERNAME=admin \
          -e MONGO_INITDB_ROOT_PASSWORD=password \
          mongo
    

    테스트 할 경우 모든 작동하는 경우 :

    // ssh into the running container
    // Change container name if necessary
    $ docker exec -it mongo /bin/bash
    
    // Enter into mongo shell
    $ mongo
    
    // Caret will change when you enter successfully
    // Switch to admin database
    $> use admin
    $> db.auth("admin", passwordPrompt())
    
    // Show available databases
    $> show dbs
    

    먼저 실행에 데이터베이스 인스턴스를 좋아한다면, 옵션 B를 선택합니다.

    비. 당신은 당신의 고정 표시기 스택 배포 파일 또는 버전 4.1을 통해 3.4에 대한 작성 파일에 환경 변수를 사용할 수 있습니다.

    그것은 당신의 YAML 파일의 공식 몽고 이미지 세트 MONGO_INITDB_ROOT_USERNAME 및 MONGO_INITDB_ROOT_PASSWORD의 빠른 참조 섹션에 설명 된 바와 같이 :

    mongo:
        image: mongo
        environment:
          MONGO_INITDB_ROOT_USERNAME: admin
          MONGO_INITDB_ROOT_PASSWORD: password
    

    따라서 이들 두 변수 세트 --auth 플래그의 존재 몽고 화상 수표 파일 docker-entrypoint.sh.

    기음. 또한 비밀을 고정 표시기 사용할 수 있습니다.

    MONGO_INITDB_ROOT_USERNAME 및 MONGO_INITDB_ROOT_PASSWORD은 MONGO_INITDB_ROOT_USERNAME_FILE 및 MONGO_INITDB_ROOT_PASSWORD_FILE 변수에서 docker-entrypoint.sh에 의해 간접적으로 설정됩니다

    mongo:
        image: mongo
        environment:
            - MONGO_INITDB_ROOT_USERNAME_FILE=/run/secrets/db_root_username
            - MONGO_INITDB_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
        secrets:
          - db_root_username
          - db_root_password
    

    MONGO_INITDB_ROOT_USERNAME 및 MONGO_INITDB_ROOT_PASSWORD에 docker-entrypoint.sh 변환 MONGO_INITDB_ROOT_USERNAME_FILE 및 MONGO_INITDB_ROOT_PASSWORD_FILE.

    데이터베이스 인스턴스를 초기화하는 동안 고정 표시기 - 엔트리 포인트-initdb.d 폴더에 또는 .sh의 .js 스크립트에서 MONGO_INITDB_ROOT_USERNAME 및 MONGO_INITDB_ROOT_PASSWORD를 사용할 수 있습니다.

    컨테이너 처음 시작하면 그것은 /docker-entrypoint-initdb.d에서 발견의 .sh와의 .js 확장자를 가진 파일을 실행합니다. 파일은 알파벳 순서로 실행됩니다. 그것이 존재하거나 그렇지 않으면 테스트 경우의 .js 파일은 MONGO_INITDB_DATABASE 변수에 의해 지정된 데이터베이스를 사용 몽고에 의해 실행된다. 또한의 .js 스크립트 내에서 데이터베이스를 전환 할 수 있습니다.

    이 업데이트를 생존 할 수 있도록이 마지막 방법은 참조 문서에 있지 않습니다.

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

    4.공식 몽고 이미지에 대한 Dockerfile는 여기에있다. 기본 명령은 mongod되어 있지만 사용자의가 이미 구성되어 가정 --auth 스위치를 추가 할 재정의 할 수 있습니다.

    공식 몽고 이미지에 대한 Dockerfile는 여기에있다. 기본 명령은 mongod되어 있지만 사용자의가 이미 구성되어 가정 --auth 스위치를 추가 할 재정의 할 수 있습니다.

    docker run -d .... mongodb:latest mongod --auth
    

    그런 다음 사용자가 작성해야하는 경우에는 기본 시작 스크립트를 교체 한 후 해당 스크립트는 사용자를 작성하고 인증 스위치와 몽고를 시작하도록 /entrypoint.sh에 시작 스크립트를 마운트 볼륨이 필요합니다.

    docker run -d .... -v $PWD/my_custom_script.sh:/entrypoint.sh mongodb:latest
    
  5. ==============================

    5.그냥 이것에 대한 작업 폴더 엔트리 포인트 초기화에은 .js 파일을 삭제

    그냥 이것에 대한 작업 폴더 엔트리 포인트 초기화에은 .js 파일을 삭제

    예를 들면 entrypoint.js

    var db = connect("mongodb://localhost/admin");
    
    db.createUser(
        {
            user: "yourAdminUserName",
            pwd: "yourAdminPassword",
            roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
        }
    )
    

    도커-compose.yml :

    db:
      image: mongo:3.2
      volumes:
       - /my/own/datadir:/data/db
       - ../mongo-entrypoint:/docker-entrypoint-initdb.d
    

    손이나 같은 작품 이상으로 나머지를 수행.

    그들은 주위에 누워되지 않도록 당신은 또한 파일을 정리하기 위해 초기화 폴더로의 .sh 파일을 삭제할 수 있습니다 당신이 원하는 경우 zz-cleanup.sh합니다.

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

    6.@jbochniak : 처음 읽을에서 나는 이미이 모든 것을 발견했습니다 생각하지만 덕분에, 당신의 예 (. 몽고 도커 이미지의 ESP 버전) 저를 도와 밝혀졌다!

    @jbochniak : 처음 읽을에서 나는 이미이 모든 것을 발견했습니다 생각하지만 덕분에, 당신의 예 (. 몽고 도커 이미지의 ESP 버전) 저를 도와 밝혀졌다!

    해당 버전 (v3.4.2)와 (현재 v3.4.3에 상당) V3.4 여전히 그 변수를 통해 지정 'MONGO_INITDB_ROOT'을 지원 V3.5의 등 (적어도 태그 '3'과의 '최신') NOT DO 당신의 대답과 문서에 설명 된대로 작동합니다.

    나는 빨리 GitHub의에 코드를 살펴했지만, 이러한 변수의 유사한 사용을보고 버그로를 제출하기 전에 그렇게해야, 즉시 버그를 찾을 수 없습니다 ...

  7. ==============================

    7.내가 댓글을 달고 싶으세요하지만, 충분히 평판이 없습니다.

    내가 댓글을 달고 싶으세요하지만, 충분히 평판이 없습니다.

    위와 같이 사용자 추가는 실행 가능한 스크립트로 수정되어야 --authenticationDatabase 관리 및 NEWDATABASENAME.

    mongo --authenticationDatabase admin --host localhost -u USER_PREVIOUSLY_DEFINED -p PASS_YOU_PREVIOUSLY_DEFINED NEWDATABASENAME --eval "db.createUser({user: 'NEWUSERNAME', pwd: 'PASSWORD', roles: [{role: 'readWrite', db: 'NEWDATABASENAME'}]});"
    

    https://i.stack.imgur.com/MdyXo.png

  8. ==============================

    8.수정이 이미지를 사용 :

    수정이 이미지를 사용 :

    고정 표시기 - compose.yml로

    services:
      db:
        image: aashreys/mongo-auth:latest
        environment:
          - AUTH=yes
          - MONGODB_ADMIN_USER=admin
          - MONGODB_ADMIN_PASS=admin123
          - MONGODB_APPLICATION_DATABASE=sample
          - MONGODB_APPLICATION_USER=aashrey
          - MONGODB_APPLICATION_PASS=admin123
        ports:
          - "27017:27017"
         // more configuration
    
  9. from https://stackoverflow.com/questions/34559557/how-to-enable-authentication-on-mongodb-through-docker by cc-by-sa and MIT license