对于自动化测试,无论是在本地还是在构建服务器上,我都在尝试启动一个带有副本集的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- 06 T18:25:06.765+0000 W NETWORK [thread 1]无法连接到127.0.0.1:27017,in(checking socket for error after poll),原因:连接被拒绝2017-10- 06 T18:25:06.765+0000 E QUERY [thread 1]错误:无法连接到服务器127.0.0.1:27017,连接尝试失败:connect@src/mongo/shell/mongo.js:237:13 @(connect):1:6 exception:连接失败
有人有在C#代码中对docker镜像执行命令的经验吗?
供参考:这是一个很好的使用docker设置mongo副本集服务器的指南,但是从命令行。Docker Replica Set Setup
2条答案
按热度按时间ki0zmccv1#
结果发现Mongo有一种使用**--eval标志评估文本的方法。
这允许我们避免同时使用-i和-t**标志。这样,**Process.Start()**函数就足够了。
解决方案:
6jygbczu2#
如果您使用https://docs.docker.com/engine/api/v1.42/#tag/Container/operation/ContainerCreate带有Docker.DotNet.Models类的www.example.com端点,则可以使用以下行创建容器副本集: