使用x509证书连接到实例后如何在docker中的mongo shell中运行命令?

问题描述

我正在运行由Dockerfile调用的bash脚本。

我给我的用户必要的权限:

chown -R mongodb:mongodb /home/mongod

我有一个包含3个实例的副本。

在启动此副本之前,我分别启动每个实例的 mongod 进程:

nohup gosu mongodb mongod --config /home/mongodb/instanceR0.conf
nohup gosu mongodb mongod --config /home/mongodb/instanceR1.conf
nohup gosu mongodb mongod --config /home/mongodb/instanceR2.conf

所有进程均成功启动。

之后,我想连接到一个实例以进行身份​​验证并启动副本集:

# connect to one db instance
nohup gosu mongodb mongo --port 57040 --ssl --host example.com --sslPEMKeyFile /home/mongodb/certificateExample.pem --sslCAFile /home/mongodb/caExample.pem

# authenticate with user
nohup gosu mongodb mongo "db.getSiblingDB('\$external').auth({ mechanism: 'MONGODB-X509',user: 'CN=example.com,OU=StackOverflow,O=Example,L=City,ST=City,C=PT' })"

# initiate replica sets
nohup gosu mongodb mongo "rs.initiate({ _id: 'replicaExample',members: [{ _id : 0,host : '127.0.0.1:57040' },{ _id : 1,host : '127.0.0.1:57041' },{ _id : 2,host : '127.0.0.1:57042' }] })"

连接到一个数据库实例时会发生问题。它成功连接到mongo shell,但是在执行用户身份验证时,它将离开mongo shell。

connecting to: mongodb://example.com:57040/?compressors=disabled&gssapiServiceName=mongodb

Implicit session: session { "id" : UUID("27eb0298-2766-4efb-8054-211e18c88ea8") }

MongoDB server version: 4.2.6

bye

我该如何构造一个bash脚本命令,该命令在连接到数据库实例后将继续在mongo shell内并执行其余2条命令(用户身份验证初始化副本集?

解决方法

解决方案:

在语句后使用--eval来运行javascript函数。

例如:

nohup gosu mongodb mongo --port 57040 --ssl --host example.com --sslPEMKeyFile /home/mongodb/certificateExample.pem --sslCAFile /home/mongodb/caExample.pem --eval "db.getSiblingDB('\$external').auth({ mechanism: 'MONGODB-X509',user: 'CN=example.com,OU=StackOverflow,O=Example,L=City,ST=City,C=PT' });rs.initiate({ _id: 'replicaExample',members: [{ _id : 0,host : '127.0.0.1:57040' },{ _id : 1,host : '127.0.0.1:57041' },{ _id : 2,host : '127.0.0.1:57042' }] })"