在连接到具有 x509 证书的实例后,如何 运行 来自 mongo shell in docker 的命令?
How to run a command from the mongo shell in docker after having connected to an instance with x509 certificates?
我是 运行 一个由 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=Whosebug,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 个命令( 与用户进行身份验证 和 启动副本集?
解决方案:
在 运行 javascript 函数的语句后使用 --eval
。
例如:
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=Whosebug,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' }] })"
我是 运行 一个由 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=Whosebug,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 个命令( 与用户进行身份验证 和 启动副本集?
解决方案:
在 运行 javascript 函数的语句后使用 --eval
。
例如:
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=Whosebug,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' }] })"