programing

시작 시 MongoDB 컨테이너를 위한 DB를 만드는 방법은 무엇입니까?

nicescript 2023. 3. 14. 23:23
반응형

시작 시 MongoDB 컨테이너를 위한 DB를 만드는 방법은 무엇입니까?

저는 Docker와 일하고 있으며 PHP, MySQL, Apache, Redis와 스택을 가지고 있습니다.지금 MongoDB를 추가해야 하기 때문에 도커파일에 최신 버전이 있는지 확인하고 도커엔트리 포인트도 확인했습니다.MongoDB Dockerhub에서 sh 파일을 생성했지만 기본 DB, 관리 사용자/패스워드 및 컨테이너의 인증 방식을 설정하는 방법을 찾을 수 없었습니다.docker-compose.ymlfilename을 클릭합니다.

MySQL 에서는, 다음과 같이 몇개의 ENV 변수를 설정할 수 있습니다.

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/비밀번호로 됩니다.root패스워드

MongoDB에서도 같은 일을 할 수 있는 방법이 있나요?경험이나 해결 방법이 있는 사람?

더 사용해 보겠습니다.docker-compose a. a. a.js★★★★★★ 。

이 예에서는 두 파일(docker-compose.yml 및 mongo-init.js)이 같은 폴더에 있는 것을 전제로 하고 있습니다.

docker-param.yml

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

mongo-init.syslog

db.createUser(
        {
            user: "<user for database which shall be created>",
            pwd: "<password of user>",
            roles: [
                {
                    role: "readWrite",
                    db: "<database to create>"
                }
            ]
        }
);

그런 다음 다음 docker-compose 명령을 실행하여 서비스를 시작합니다.

docker-compose up --build -d mongodb 

주의: docker-entrypoint-init.d 폴더의 코드는 데이터베이스가 초기화되지 않은 경우에만 실행됩니다.

도커 허브 이미지에서는 모든 스크립트가 실행됩니다./docker-entrypoint-initdb.d/ 도 입력되지 않은 /data/db디렉토리로 이동합니다.

데이터베이스 초기화

mongo는 「」를 ./docker-entrypoint-initdb.d/ .js ★★★★★★★★★★★★★★★★★」.sh셋업 스크립트는 데이터베이스 초기화 시 한 번 실행됩니다. .js는 크립트 scripts scripts scripts scripts scripts scripts scripts 、 scripts scripts scripts 。test 또는 " " " 입니다.MONGO_INITDB_DATABASE환경에 정의되어 있는 경우.

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

또는

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

간단한 초기화 mongojavascript 파일로, 이 파일에서는,container데이터 수집, 로깅 및 오류와 함께 종료하는 방법(결과 확인용)을 참조하십시오.

let error = true

let res = [
  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)
}

관리 사용자 설정

"root" 사용자 설정을 제어하는 환경 변수는 다음과 같습니다.

  • MONGO_INITDB_ROOT_USERNAME
  • MONGO_INITDB_ROOT_PASSWORD

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

★★★★★★★★★★★★★★★★★」Dockerfile

FROM docker.io/mongo
ENV MONGO_INITDB_ROOT_USERNAME admin
ENV MONGO_INITDB_ROOT_PASSWORD password

안 돼요.--auth로서 entrypoint.sh스크립트에서는 환경변수가 존재하는 것을 검출할 때 이 값을 추가합니다.

UPD 오늘날 나는 도커 무리, 비밀, 구성을 피한다.나는 그것을 가지고 실행한다.docker-compose.env아마k8s를 K8s입니다.[ ] [ ], [ ], [ ], [ ], [ ]외부와 연결되지 않은 컨테이너에서 단일 데이터베이스를 실행할 때 이러한 데이터베이스가 정말 중요합니까?어떻게 생각하시는지 알고 싶습니다만, Stack Overflow는 아마 이런 종류의 커뮤니케이션에는 적합하지 않을 것입니다.

는 몽고의 수 .MONGO_INITDB_DATABASE 변수는 생성되지 않습니다.이 변수는 실행 시 현재 데이터베이스를 결정합니다./docker-entrypoint-initdb.d/* 스크립트Mongo가 실행하는 스크립트에서는 환경변수를 사용할 없기 때문에 셸 스크립트를 선택했습니다.

docker-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 = '$MONGO_INITDB_ROOT_PASSWORD';
    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

「」를 보존할 .init-mongo.shsyslog(syslog))docker config create탑재할 수 있습니다.

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

그리고 비밀은 파일에 저장될 수 없습니다.

문제에 대해 몇 가지 문제가 있다.

이 솔루션은 다음과 같이 기능합니다.admin-user, 「」)test-database및 , 。test-user이치노

도커 파일:

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/

mongo-init.syslog:

db.auth('admin-user', 'admin-password')

db = db.getSiblingDB('test-database')

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

어려운 부분은 *.js 파일이 인증되지 않은 상태로 실행된다는 것을 이해하는 것이었습니다.합니다.admin-user admin데이터베이스입니다. MONGO_INITDB_DATABASE admin 않으면 .그렇지 않으면 스크립트는 에 대해 실행됩니다.testdb. 도커 엔트리 포인트의 소스 코드를 확인합니다.!

MongoDB 인증을 하여 MongoDB를 docker-compose다음으로 환경변수를 사용한 설정 예를 나타냅니다.

version: "3.3"

services:

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

" " 를 실행하고 docker-compose upenabled.mongo에서 됩니다.지정된 비밀번호를 가진 관리 데이터베이스가 있습니다.

이것으로 충분합니다.

도킹 스테이션야무지다

version: "3.8"

services:
  mongodb:
    image: mongo:3.6
    restart: always
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=hello
    volumes:
      - ./mongo-init/:/docker-entrypoint-initdb.d/:ro
    ports:
      - 27017:27017
      - 9229:9229

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8111:8081
    environment:
      - ME_CONFIG_MONGODB_SERVER=mongodb
      - ME_CONFIG_MONGODB_ADMINUSERNAME=root
      - ME_CONFIG_MONGODB_ADMINPASSWORD=hello

./mongo-init/init.module

conn = new Mongo();
db = conn.getDB("MyDatabaseName");


db.myCollectionName.createIndex({ "address.zip": 1 }, { unique: false });

db.myCollectionName.insert({ "address": { "city": "Paris", "zip": "123" }, "name": "Mike", "phone": "1234" });
db.myCollectionName.insert({ "address": { "city": "Marsel", "zip": "321" }, "name": "Helga", "phone": "4321" });

대시보드를 http://localhost:8111/:

여기에 이미지 설명 입력

경우.env 삭제:

DB_NAME=foo
DB_USER=bar
DB_PASSWORD=baz

이 ★★★★★★★★★★★★★★★★★.mongo-init.sh 삭제:

mongo --eval "db.auth('$MONGO_INITDB_ROOT_USERNAME', '$MONGO_INITDB_ROOT_PASSWORD'); db = db.getSiblingDB('$DB_NAME'); db.createUser({ user: '$DB_USER', pwd: '$DB_PASSWORD', roles: [{ role: 'readWrite', db: '$DB_NAME' }] });"

★★★★★★★★★★★★★★★★★.docker-compose.yml 사용자를 후 실제 합니다.

version: '3'

services:
#  app:
#    build: .
#    env_file: .env
#    environment:
#      DB_HOST: 'mongodb://mongodb'

  mongodb:
    image: mongo:4
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin-user
      MONGO_INITDB_ROOT_PASSWORD: admin-password
      DB_NAME: $DB_NAME
      DB_USER: $DB_USER
      DB_PASSWORD: $DB_PASSWORD
    ports:
      - 27017:27017
    volumes:
      - db-data:/data/db
      - ./mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh

volumes:
  db-data:

환경 변수와 비밀을 사용하여 이렇게 합니다.

다음은 mongo 컨테이너 부팅 시 "app_user" 및 "app_database"를 만듭니다(/data/db에 저장된 사용된 데이터베이스가 비어 있는 경우에만).

도커 파일

FROM mongo:5.0.3

COPY images/mongo/init.js /docker-entrypoint-initdb.d/

초기화

db.log.insertOne({"message": "Database created."});

db.createUser(
    {
        user: _getEnv("MONGO_USER"),
        pwd: cat(_getEnv("MONGO_PASSWORD_FILE")),
        roles: [
            "readWrite", "dbAdmin"
        ]
    }
);
  • 스크립트는 데이터베이스 이름으로 MONGO_INITDB_DATABASE(docker-compose.yml에 정의되어 있는env 변수)를 사용합니다.
  • /docker-entrypoint-initdb.d/의 스크립트는 /data/db에 저장된 사용된 데이터베이스가 비어 있는 경우에만 실행됩니다.

docker-param.yml

mongo:
  build:
    context: .
    dockerfile: ./images/mongo/Dockerfile
  container_name: app_mongo
  environment:
    MONGO_INITDB_DATABASE: "app_database"
    MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/app_mongo_root_password
    MONGO_INITDB_ROOT_USERNAME: "root"
    MONGO_PASSWORD_FILE: /run/secrets/app_mongo_password
    MONGO_USER: "app_user"
  secrets:
    - app_mongo_password
    - app_mongo_root_password
  volumes:
    - mongo:/data/db

secrets:
  app_mongo_password:
    file: ./secrets/app_mongo_password.txt
  app_mongo_root_password:
    file: ./secrets/app_mongo_root_password.txt

volumes:
  mongo:

몇 가지 답변에 대한 간단한 추가 설명입니다. 모두 훌륭합니다. 문제를 해결하는 데 많은 시간을 절약할 수 있었습니다.

생성하려는 사용자가 특정 데이터베이스에 연결되어야 하는 경우 코드를 추가합니다.

중요한 것은 새로운 사용자를 작성하려면 관리자 기반에 로그인해야 한다는 것입니다.

★★★★★의 경우docker-compose.yml를 들어, 당신의 '예'는,」, 「예」는,mongo-init.js을 사용하다

db = db.getSiblingDB('admin');
// move to the admin db - always created in Mongo
db.auth("rootUser", "rootPassword");
// log as root admin if you decided to authenticate in your docker-compose file...
db = db.getSiblingDB('DB_test');
// create and move to your new database
db.createUser({
'user': "dbUser",
'pwd': "dbPwd",
'roles': [{
    'role': 'dbOwner',
    'db': 'DB_test'}]});
// user created
db.createCollection('collection_test');
// add new collection

그게 누군가를 도울 수 있다면 난 기뻐 - 건배 -

도커 컴포지트에서 사용자 이름과 비밀번호를 삭제하는 경우.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

나는 내 비밀에 file: 옵션을 사용하지만, 당신은 또한 외부:사용할 수 있고, 비밀은 무리 지어 사용할 수 있습니다.

비밀은 컨테이너 내의 /var/run/secrets에 있는 모든 스크립트에서 사용할 수 있습니다.

도커 문서에는 기밀 데이터 저장에 대해 다음과 같이 기술되어 있습니다.

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

실행 시 컨테이너에 필요한 중요한 데이터를 비밀 정보를 사용하여 관리할 수 있지만 다음과 같이 이미지나 소스 제어에 저장하지 않을 수 있습니다.

사용자 이름 및 비밀번호 TLS 인증서 및 키 SSH 키 데이터베이스 또는 내부 서버 이름 등 기타 중요한 데이터 범용 문자열 또는 바이너리 콘텐츠(최대 500KB 크기)

답변은 @x-yuri가 제공한 것에 근거하고 있습니다만, 제 시나리오는 조금 다릅니다.스크립트를 포함한 이미지를 원했습니다.바인드 마운트 없이 바인드 할 필요는 없었습니다.

mongo-init.shchmod +x mongo-init.sh아,아,아,아,아,아,아,아,아,아,아,아,아.

#!/bin/bash
# https://stackoverflow.com/a/53522699
# https://stackoverflow.com/a/37811764
mongo -- "$MONGO_INITDB_DATABASE" <<EOF
  var rootUser = '$MONGO_INITDB_ROOT_USERNAME';
  var rootPassword = '$MONGO_INITDB_ROOT_PASSWORD';
  var user = '$MONGO_INITDB_USERNAME';
  var passwd = '$MONGO_INITDB_PASSWORD';

  var admin = db.getSiblingDB('admin');

  admin.auth(rootUser, rootPassword);
  db.createUser({
    user: user,
    pwd: passwd,
    roles: [
      {
        role: "root",
        db: "admin"
      }
    ]
  });
EOF

Dockerfile:

FROM mongo:3.6

COPY mongo-init.sh /docker-entrypoint-initdb.d/mongo-init.sh

CMD [ "/docker-entrypoint-initdb.d/mongo-init.sh" ]

docker-compose.yml:

version: '3'

services:
    mongodb:
        build: .
        container_name: mongodb-test
        environment:
            - MONGO_INITDB_ROOT_USERNAME=root
            - MONGO_INITDB_ROOT_PASSWORD=example
            - MONGO_INITDB_USERNAME=myproject
            - MONGO_INITDB_PASSWORD=myproject
            - MONGO_INITDB_DATABASE=myproject

    myproject:
        image: myuser/myimage
        restart: on-failure
        container_name: myproject
        environment:
            - DB_URI=mongodb
            - DB_HOST=mongodb-test
            - DB_NAME=myproject
            - DB_USERNAME=myproject
            - DB_PASSWORD=myproject
            - DB_OPTIONS=
            - DB_PORT=27017            
        ports:
            - "80:80"

그 후, 이 Docke 파일을 다른 프로젝트에 사용할 수 있는 이미지로 공개했습니다.

" " 를 하지 : " " "CMDit mongo shrows: Unbound Variable Er

루트 액세스 없이 MongoDB 도커 컨테이너에 여러 데이터베이스사용자를 작성하는 단계입니다.

  1. docker-compose down
    
    또는 「」를 참조해 주세요.'docker-compose -f docker-compose.yml -f docker-compose.dev.yml <...>'★★★★★★★★★★★★★★★★」
  2. 몽고몽고 실행합니다.'docker volume ls'와 것이 ...면비면면면면면면면<projectfolder>_mongodb--vol , , , , , , , 을 합니다.
    docker volume rm <projectfolder>_mongodb--vol
    
  3. 「」로..js ★★★★★★★★★★★★★★★★★」.shmongo 데이터베이스 초기화 스크립트예를들면,mongo-init/db_1.js
    conn = new Mongo();
    db = conn.getDB("db_1")
    db.createUser(
    {
        user: "db_1_service_user",
        pwd: "<password>",
        roles: [
            {
                role: "readWrite",
                db: "db_1"
            }
        ]
    }
    );
    
    해 주세요.mongo-init/db_2.jsfile.conn.getDB()는 데이터베이스를 만들고 db.createUser()는 사용자를 생성하여 데이터베이스에 할당합니다.
  4. fragment는 docker-backer.yml fragment로부터의 해 주세요../mongo-init/로의 /docker-entrypoint-initdb.d/
    version: "3.8"
    services:
    
      my-service_1:
        depends_on:
          - mongodb
    
      my-service_2:
        depends_on:
          - mongodb
    
      mongodb:
        image: mongo:4.4-bionic
        ports:
        - "27017:27017"
        volumes:
        - mongodb--vol:/data/db
        - ./mongo-init/:/docker-entrypoint-initdb.d/:ro
        healthcheck:
        test: "echo 'db.runCommand(\"ping\").ok'"
        interval: 5s
        timeout: 5s
        retries: 3
    
    # in-service volumes are very slow in MacOS and Windows, 
    # so using fast shared volumes for large storage
    volumes:
        mongodb--vol:
    
  5. 프로그램에을 적용합니다.
    mongodb://db_1_service_user:<password>@mongodb:27017/db_1
    
    mongodb://db_2_service_user:<password>@mongodb:27017/db_2
    

docker-compose를 사용하고 있으며 볼륨을 작성한 후 이러한 제안 중 하나를 실행하려고 할 경우 볼륨이 이미 존재하는 경우 init 스크립트는 실행되지 않으므로 볼륨을 삭제해야 할 수 있습니다.

이 경우에 해당하는지를 확인하려면 , 다음의 순서를 실행합니다.

docker volume ls

mongo 데이터가 있는 경우 다음과 같은 볼륨 이름으로 표시됩니다.

<db>_<volume>

볼륨이 db_volume과 같은 경우 다음을 실행해야 합니다.

docker volume rm db_volume

이 작업을 수행하려면 컨테이너를 폐기해야 할 수 있습니다.

언급URL : https://stackoverflow.com/questions/42912755/how-to-create-a-db-for-mongodb-container-on-start-up

반응형