使用副本集启动Docker Mongo

jtw3ybtb  于 2023-05-06  发布在  Docker
关注(0)|答案(2)|浏览(113)

对于自动化测试,无论是在本地还是在构建服务器上,我都在尝试启动一个带有副本集的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

ki0zmccv

ki0zmccv1#

结果发现Mongo有一种使用**--eval标志评估文本的方法。
这允许我们避免同时使用
-i-t**标志。这样,**Process.Start()**函数就足够了。
解决方案:

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

6jygbczu2#

如果您使用https://docs.docker.com/engine/api/v1.42/#tag/Container/operation/ContainerCreate带有Docker.DotNet.Models类的www.example.com端点,则可以使用以下行创建容器副本集:

var config = new Config()
            {
                Cmd = new List<string>(){"--replSet", "rs0", "--bind_ip_all"},
                Healthcheck = new HealthConfig
                {
                    Test = new List<string>(){"CMD-SHELL","mongosh --eval \"rs.initiate()\""},
                    StartPeriod = TimeSpan.FromSeconds(2).Ticks,
                },
            };

相关问题