如何将环境变量传递给 mongo docker-entrypoint-initdb.d?

Posted

技术标签:

【中文标题】如何将环境变量传递给 mongo docker-entrypoint-initdb.d?【英文标题】:How can I pass environment variables to mongo docker-entrypoint-initdb.d? 【发布时间】:2021-02-12 19:34:05 【问题描述】:

我正在尝试执行以下教程: https://itnext.io/docker-mongodb-authentication-kubernetes-node-js-75ff995151b6

但是,在那里,他们使用位于 docker-entrypoint-initdb.d 文件夹中的 mongo init.js 文件的原始值。

我想使用来自我的 CI/CD 系统 (Gitlab) 的环境变量。有谁知道如何将环境变量传递给 init.js 文件?我已经尝试了几种方法,例如使用 init.sh 代替 shell,但没有任何成功。

如果我手动运行 init shell 版本,我可以让它工作,因为我用 --eval 调用 mongo 并传递值,但是,docker-entrypoint-blabla 是自动调用的,所以我无法控制如何这就是所谓的,我不知道我能做些什么来实现我想要的。

提前谢谢你和问候。

【问题讨论】:

【参考方案1】:

您可以使用 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

docker-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 数据库。

【讨论】:

不适用;当我创建这个问题时,我问的是按照教程用 Kubernetes 做这个。无论如何,谢谢你,它会帮助人们【参考方案2】:

使用 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行,因为该文件将被获取。

【讨论】:

【参考方案3】:

您可以使用envsubs。 如果找不到命令:here。如果您使用 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')

【讨论】:

谢谢!最后我设法直接在 sh 脚本中使用环境变量,问题是我在上面的行中有一个错字,这会引发 env。不能正确创建变量!【参考方案4】:

最后答案是您可以在 docker-entrypoint-initdb.d 文件夹中使用 .sh 文件而不是 .js 文件。在 sh 脚本中,您可以直接使用环境变量。但是,一开始我不能这样做,因为我有一个错字并且没有正确创建环境变量。

【讨论】:

以上是关于如何将环境变量传递给 mongo docker-entrypoint-initdb.d?的主要内容,如果未能解决你的问题,请参考以下文章

如何将环境变量传递给由 systemd 启动的服务

如何将环境变量传递给pytest

如何将环境变量传递给前端 Web 应用程序?

如何在传递 ShellCheck 时通过环境变量将 glob 传递给 shell 脚本

如何使用 process.env 将环境变量中的 API 密钥传递给 Ember CLI?

我应该如何将敏感的环境变量传递给 Amazon ECS 任务?