旋转docker蒙戈与副本集

对于本地和构build服务器上的自动化testing,我正在尝试使用副本集(我需要oplog)创build一个mongo映像。

副本集的设置要求我进入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时 ,我得到以下错误:

input设备不是TTY。 如果您使用的是mintty,请尝试在命令前加上'winpty'

我能find的唯一解决scheme是只通过-i标志。 不pipe出于什么原因,这就阻止了我连接到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:6exception:连接失败

有没有人在C#代码中的docker图像上执行命令的任何经验?


作为参考:这是一个很好的指导,用docker设置一个mongo副本集服务器,但是从命令行。 Docker副本集设置

原来,Mongo有一种使用–eval标志来评估文本的方法。

这使我们可以避免使用-i-t标志。 以这种方式, Process.Start()函数就足够了。

解:

 Process.Start("docker", "exec test_mongo mongo --eval \"rs.initiate()\"").WaitForExit();