对于本地和构建服务器上的自动化测试,我试图使用副本集启动mongo映像(我需要oplog)。
副本集设置要求我进入mongo shell并调用" rs.initiate()"。我希望这一切都在代码中完成。
public void SpinUpMongoWithReplicaSet()
{
Process.Start("docker", "run -p 123:27017 --name test_mongo -d mongo:latest mongod --replSet rs0").WaitForExit();
var replicaSetProcess = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "docker",
Arguments = "exec -it test_mongo mongo",
UseShellExecute = false,
RedirectStandardInput = true
}
};
replicaSetProcess.Start();
using(StreamWriter writer = replicaSetProcess.StandardInput)
{
writer.WriteLine("rs.initiate()");
writer.WriteLine("exit");
}
replicaSetProcess.WaitForExit();
}
但是,docker exec命令存在问题。
传入 -it 或只是 -t 时,我收到以下错误:
输入设备不是TTY。如果您使用的是mintty,请尝试在命令前加上' winpty'
我能找到的唯一解决方案是只传入 -i 标志。无论出于何种原因,这会阻止我连接到mongo容器:
MongoDB shell版本v3.4.9 连接到:mongodb://127.0.0.1:27017 2017-10-06T18:25:06.765 + 0000 W NETWORK [thread1]无法连接到127.0.0.1:27017,在(查询套接字以查看轮询后的错误),原因:连接被拒绝 2017-10-06T18:25:06.765 + 0000 E QUERY [thread1]错误:无法连接到服务器127.0.0.1:27017,连接尝试失败: connect@src/mongo/shell/mongo.js:237:13 @(连接):1:6 异常:连接失败
有没有人有在C#代码中对docker镜像执行命令的经验?
供参考:这是使用docker设置mongo副本集服务器的一个很好的指南,但是从命令行。 Docker Replica Set Setup
答案 0 :(得分:0)
事实证明,Mongo有一种使用 - eval 标志评估文本的方法。
这样我们就可以避免同时使用 -i 和 -t 标志。通过这种方式, Process.Start()功能就足够了。
解决方案:
Process.Start("docker", "exec test_mongo mongo --eval \"rs.initiate()\"").WaitForExit();