系統(tǒng)版本:
Docker version 20.10.7, build f0df350 docker-compose version 1.29.2, build 5becea4c
1.docker-compose文件和start.sh
環(huán)境變量:Linux下必須export聲明兩個(gè)環(huán)境變量,注意這個(gè)賬戶同時(shí)也是創(chuàng)建的數(shù)據(jù)庫(kù)的連接用戶密碼
export MONGO_INITDB_ROOT_USERNAME=<用戶名>
export MONGO_INITDB_ROOT_PASSWORD=<密碼>
目錄:/home/user/docker-compose.yml
鏡像:mongo:6.0.10
容器名:mongobss
掛載卷:data/db數(shù)據(jù)目錄 start.sh后創(chuàng)建用戶和庫(kù)的腳本
環(huán)境變量:定義初始的mongo root角色用戶
privileged:給予容器高權(quán)限
version: '3' services: mongodb: image: mongo:6.0.10 container_name: mongobss ports: - 27017:27017 privileged: true volumes: - "./data/db:data/db" - "./start.sh:/docker-entrypoint-initdb.d/start.sh" #這里是關(guān)鍵點(diǎn)涉及到mongo官方打包鏡像時(shí)定義的sh啟動(dòng)文件在3中講解 environment: - MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME} - MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD} tty: true
?文章來源地址http://www.zghlxwxcb.cn/news/detail-760193.html
目錄:/home/user/start.sh
set -e:遇到錯(cuò)誤shell不退出
mongosh:mongo高版本的命令行工具替代了原有的mongo,該腳本使用mongosh創(chuàng)建了初始的用戶和庫(kù)
#!/bin/bash set -e echo "Creating database: <庫(kù)名>" mongosh --username ${MONGO_INITDB_ROOT_USERNAME} --password ${MONGO_INITDB_ROOT_PASSWORD} <<EOF use admin use <庫(kù)名> db.createUser({ user: "${MONGO_INITDB_ROOT_USERNAME}", pwd: "${MONGO_INITDB_ROOT_PASSWORD}", roles: [{ role: "readWrite", db: "<庫(kù)名>" }] }) EOF
2.啟動(dòng)容器:
目錄:/home/user
命令:
cd /home/user export 用戶變量 export 密碼變量 //能聯(lián)網(wǎng) docker pull mongo:6.0.10 //內(nèi)網(wǎng)環(huán)境 //需要mongo 6.0.10的鏡像tar, 一半網(wǎng)上找不到,可以在vmware中pull一個(gè)下來執(zhí)行 docker save -o mongo.tar <鏡像ID> 可以保存為tar包再上傳到內(nèi)網(wǎng)服務(wù)器 docker load -i mongo.tar docker-compose up -d
//查看容器運(yùn)行狀態(tài),測(cè)試中初始化的時(shí)長(zhǎng)大概在40秒左右完成腳本執(zhí)行,其他服務(wù)才能連上mongo,如果有其他服務(wù)連接mongo建議發(fā)起一個(gè)sleep等待這個(gè)時(shí)間
docker ps
dcoker logs -f monogobss
//成功的日志輸出
{"t":{"$date":"2023-12-16T04:42:41.548+00:00"},"s":"I", "c":"STORAGE", "id":22262, "ctx":"initandlisten","msg":"Timestamp monitor starting"}
{"t":{"$date":"2023-12-16T04:42:41.550+00:00"},"s":"I", "c":"NETWORK", "id":23015, "ctx":"listener","msg":"Listening on","attr":{"address":"/tmp/mongodb-27017.sock"} }
{"t":{"$date":"2023-12-16T04:42:41.550+00:00"},"s":"I", "c":"NETWORK", "id":23015, "ctx":"listener","msg":"Listening on","attr":{"address":"0.0.0.0"}}
{"t":{"$date":"2023-12-16T04:42:41.550+00:00"},"s":"I", "c":"NETWORK", "id":23016, "ctx":"listener","msg":"Waiting for connections","attr":{"port":27017,"ssl":"off"}}
{"t":{"$date":"2023-12-16T04:42:44.816+00:00"},"s":"I", "c":"NETWORK", "id":22943, "ctx":"listener","msg":"Connection accepted","attr":{"remote":"192.168.208.3:51104","uuid":"66225b3a-525e-450c-9d2b-a97d3bf173c9","connectionId":1,"connectionCount":1}}
3.docker-entrypoint-initdb.d作用:
mongo官方ENTRYPOINT容器入口文件:
https://github.com/docker-library/mongo/blob/master/docker-entrypoint.sh
這是在mongo官方文檔查到的他們?cè)跇?gòu)建鏡像時(shí)?ENTRYPOINT 指定的容器啟動(dòng)端口文件docker-entrypoint.sh,當(dāng)docker啟動(dòng)mongo容器時(shí)mongo首先會(huì)執(zhí)行該這個(gè)腳本。
b70ce161a9f4 mongo:6.0.10 "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:27017->27017/tcp, :::27017->27017/tcp mongobss
該腳本一共420行大多部分都是啟動(dòng)mongo進(jìn)程的準(zhǔn)備,主要關(guān)注的是最后幾行,for循環(huán)讀取/docker-entrypoint-initdb.d/ 該文件下的.sh .js格式腳本去執(zhí)行,如果按照常規(guī)方法使用docker-compose的command字段會(huì)替換掉ENTRYPOINT 指定的啟動(dòng)文件也就無(wú)法啟動(dòng)mongo進(jìn)程,但是采用 1 中volume掛載方式將腳本放入for指定的目錄下,就會(huì)自動(dòng)執(zhí)行。
export MONGO_INITDB_DATABASE="${MONGO_INITDB_DATABASE:-test}" echo for f in /docker-entrypoint-initdb.d/*; do case "$f" in *.sh) echo "$0: running $f"; . "$f" ;; *.js) echo "$0: running $f"; "${mongo[@]}" "$MONGO_INITDB_DATABASE" "$f"; echo ;; *) echo "$0: ignoring $f" ;; esac echo done
4.外部程序使用mongo:
java -jar啟動(dòng)jar包為例:
假設(shè)你的配置文件引用的是環(huán)境變量,要注意因?yàn)閙ongo容器啟動(dòng)時(shí)間較長(zhǎng)我們主程序要等待mongo容器初始化完成在發(fā)起鏈接請(qǐng)求mongo,可以在服務(wù)的啟動(dòng)文件sleep 45秒左右
[root@ config]# vi application.properties?
spring.data.mongodb.uri=${SPRING_DATA_MONGODB_URI}
?文章來源:http://www.zghlxwxcb.cn/news/detail-760193.html
這是docker-compose啟動(dòng)服務(wù)容器時(shí)環(huán)境變量的寫法:要注意這個(gè)compose文件有兩個(gè)容器 1 mongo的container_name=mongodb 2 jar包的應(yīng)用程序,根據(jù)docker網(wǎng)絡(luò)的特性可以直接使用hostname引用mongo
environment: - SPRING_DATA_MONGODB_URI=mongodb://${MONGO_INITDB_ROOT_USERNAME}:${MONGO_INITDB_ROOT_PASSWORD}@mongodb:27017/BSStructure
?
?
?
?
?
?
?
到了這里,關(guān)于docker-compose mongo 啟動(dòng)mongo容器后如何執(zhí)行腳本創(chuàng)建用戶數(shù)據(jù)庫(kù)問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!