[英]How to make docker wait for SQL script inside /docker-entrypoint-initdb.d to be executed
[英]How can I pass environment variables to mongo docker-entrypoint-initdb.d?
我正在尝试执行以下教程: https://itnext.io/docker-mongodb-authentication-kubernetes-node-js-75ff995151b6
但是,在那里,他们使用 mongo init.js 文件的原始值,该文件位于 docker-entrypoint-initdb.d 文件夹中。
我想使用来自我的 CI/CD 系统 (Gitlab) 的环境变量。 有谁知道如何将环境变量传递给 init.js 文件? 我尝试了几件事,例如使用 init.sh 代替 shell 但没有任何成功。
如果我手动运行 init shell 版本,我可以让它工作,因为我用 --eval 调用 mongo 并传递值,但是,docker-entrypoint-blabla 是自动调用的,所以我无法控制它是如何调用的我不知道我能做些什么来实现我想要的。
预先感谢您和问候。
您可以使用 shell 脚本来检索环境变量并创建用户。
initdb.d/init-mongo.sh
set -e
mongo <<EOF
use $MONGO_INITDB_DATABASE
db.createUser({
user: '$MONGO_INITDB_USER',
pwd: '$MONGO_INITDB_PWD',
roles: [{
role: 'readWrite',
db: '$MONGO_INITDB_DATABASE'
}]
})
EOF
码头工人-compose.yml
version: "3.7"
services:
mongodb:
container_name: "mongodb"
image: mongo:4.4
hostname: mongodb
restart: always
volumes:
- ./data/mongodb/mongod.conf:/etc/mongod.conf
- ./data/mongodb/initdb.d/:/docker-entrypoint-initdb.d/
- ./data/mongodb/data/db/:/data/db/
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=root
- MONGO_INITDB_DATABASE=development
- MONGO_INITDB_USER=mongodb
- MONGO_INITDB_PWD=mongodb
ports:
- 27017:27017
command: [ "-f", "/etc/mongod.conf" ]
现在您可以使用mongodb
作为用户和密码凭据连接到development
数据库。
使用 shell 脚本(例如mongo-init.sh
)来访问变量。 仍然可以在里面运行 JavaScript 代码,如下所示。
set -e
mongo <<EOF
use admin
db.createUser({
user: '$MONGO_ADMIN_USER',
pwd: '$MONGO_ADMIN_PASSWORD',
roles: [{
role: 'readWrite',
db: 'dummydb'
}]
})
EOF
开始时不需要 Shebang 行,因为将获取此文件。
您可以使用envsubs
。 如果找不到命令:这里。 如果您使用 shell 运行程序,则将其安装在运行程序主机上,否则,在运行程序使用的 docker 映像中,或直接在您的脚本中。
(注意:您的链接不是免费的,所以我无法适应您的情况:p)
init.js.template
:
console.log('$GREET $PEOPLE $PUNCTUATION')
console.log('Pipeline from $CI_COMMIT_BRANCH')
gitlab_ci.yml
:
variables:
GREET: "hello"
PEOPLE: "world"
PUNCTUATION: "!"
# ...
script:
- (envsubst < path/to/init.js.template) > path/to/init.js
- cat path/to/init.js
输出:
$ (envsubst < init.js.template) > init.js
$ cat init.js
console.log('hello world !')
console.log('Pipeline from master')
最后,答案是您可以在 docker-entrypoint-initdb.d 文件夹中使用 .sh 文件而不是 .js 文件。 在 sh 脚本中,您可以直接使用环境变量。 但是,一开始我不能这样做,因为我有一个错字并且没有正确创建环境变量。
我更喜欢这种方法,因为它允许您保留一个普通的 .js 文件,而不是将 .js 文件嵌入到字符串中。
像这样创建一个 dockerfile:
FROM mongo:5.0.9
USER mongodb
WORKDIR /docker-entrypoint-initdb.d
COPY env_init_mongo.sh env_init_mongo.sh
WORKDIR /writing
COPY mongo_init.js mongo_init.js
WORKDIR /db/data
在 mongo_init.js 文件的顶部,您可以定义所需的变量
db_name = DB_NAME
schema_version = SCHEMA_VERSION
然后在您的 env_init_mongo.sh 文件中,您可以将所需的字符串替换为环境变量或在文件顶部添加行:
mongo_init="/writing/mongo_init.js"
sed "s/SCHEMA_VERSION/$SCHEMA_VERSION/g" -i $mongo_init
sed "s/DB_NAME/${MONGO_INITDB_DATABASE}/g" -i $mongo_init
sed "1s/^/use ${MONGO_INITDB_DATABASE}\n/" -i $mongo_init # add to top of file
mongo < $mongo_init
直到最近,我只是在 docker docker-entrypoint-initdb.d
目录中使用.sh
shell 脚本来访问 ENV 变量,就像@Lazaro 的回答一样。
现在可以使用process.env
从 javascript 文件中访问环境变量,前提是该文件使用较新的mongosh
而不是现在已弃用的mongo
运行。
但是,根据文档(请参阅“初始化新实例”),如果使用版本 6 或更高版本, mongosh
仅用于docker-entrypoint-initdb.d
中的.js
文件。 我可以使用mongo:6
图像标签确认这是有效的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.