시작 시 MongoDB 컨테이너를 위한 DB를 만드는 방법은 무엇입니까?
저는 Docker와 일하고 있으며 PHP, MySQL, Apache, Redis와 스택을 가지고 있습니다.지금 MongoDB를 추가해야 하기 때문에 도커파일에 최신 버전이 있는지 확인하고 도커엔트리 포인트도 확인했습니다.MongoDB Dockerhub에서 sh 파일을 생성했지만 기본 DB, 관리 사용자/패스워드 및 컨테이너의 인증 방식을 설정하는 방법을 찾을 수 없었습니다.docker-compose.yml
filename을 클릭합니다.
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/
간단한 초기화 mongo 쉘 javascript 파일로, 이 파일에서는,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.sh
syslog(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
않으면 .그렇지 않으면 스크립트는 에 대해 실행됩니다.test
db. 도커 엔트리 포인트의 소스 코드를 확인합니다.쉿!
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 up
enabled.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.sh
chmod +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 파일을 다른 프로젝트에 사용할 수 있는 이미지로 공개했습니다.
" " 를 하지 : " " "CMD
it mongo shrows: Unbound Variable Er
루트 액세스 없이 MongoDB 도커 컨테이너에 여러 데이터베이스 및 사용자를 작성하는 단계입니다.
- 을
또는 「」를 참조해 주세요.docker-compose down
'docker-compose -f docker-compose.yml -f docker-compose.dev.yml <...>'
★★★★★★★★★★★★★★★★」 - 몽고몽고 실행합니다.
'docker volume ls'
와 것이 ...면비면면면면면면면<projectfolder>_mongodb--vol
, , , , , , , 을 합니다.docker volume rm <projectfolder>_mongodb--vol
- 「」로.
.js
★★★★★★★★★★★★★★★★★」.sh
mongo 데이터베이스 초기화 스크립트예를들면,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.js
file.conn.getDB()는 데이터베이스를 만들고 db.createUser()는 사용자를 생성하여 데이터베이스에 할당합니다. - 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:
- 프로그램에을 적용합니다.
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
'programing' 카테고리의 다른 글
Azure에서 "엔터프라이즈 애플리케이션"과 "앱 등록"의 차이점 (0) | 2023.03.14 |
---|---|
Angularjs에서 $watch 또는 ng-change를 사용하는 경우 (0) | 2023.03.14 |
WooCommerce 체크아웃 필드 값 제거 (0) | 2023.03.14 |
개체 배열에 대한 TypeScript 열거 (0) | 2023.03.14 |
네트워크 프록시 뒤의 스프링 부트 (0) | 2023.03.14 |