尝试以编程方式运行容器时从Docker退出代码125

时间:2018-12-05 20:42:54

标签: c# docker process programmatically-created docker-for-windows

我正在尝试进行集成测试。在测试初始化​​阶段,我尝试从docker镜像启动Redis服务器。

var p = new Process { StartInfo = new ProcessStartInfo("docker", "run --name redistest –p 6379:6379 redis")};
p.Start();

当我这样做时,该过程以退出代码 125 退出。如果我注释掉了这些行,请在执行测试代码之前在测试中击中一个断点,然后从命令行

运行
docker run --name redistest -p 6379:6379 redis

从断点继续时,测试将按预期运行。 125 存在代码仅表示docker run失败,因此没有更多信息可以继续。

在命令行调用或C#调用之前,我确保没有名为redistest的容器

docker stop redistest
docker rm redistest

但是行为上的差异仍然存在。所有这些以编程方式运行docker的尝试均失败:

  • 添加-d
  • 以普通用户身份运行
  • 以提升的特权运行
  • 从测试中运行
  • 从.NET Framework控制台应用程序运行

为什么docker run命令的编程过程创建会导致docker以125退出?

对于某些图像,它以编程方式仅能正常工作,而对于其他图像,则不能。

3 个答案:

答案 0 :(得分:0)

我无法找出无法运行该容器的原因,实际上它确实发生在其他一些容器上。我仍在寻找答案,但是如果有人需要,这里提供了一种解决方法。

博客文章Integration testing using a docker container描述了使用Docker.DotNet NuGet程序包需要编写的代码,该程序包是与Docker SDK进行交互的客户端。

现在,我可以将这段代码放入集成测试装置中:

    [AssemblyInitialize]
    public static async Task InitializeDockerContainers(TestContext testContext)
    {
        await DockerSupport.StartDockerContainer("my container", "redis", "4.0.5-alpine", 6379);
    } 

并将其与(我已经在使用的)stoprm命令结合使用,以便在集成测试过程中干净地创建和删除容器。

答案 1 :(得分:0)

即使这是一个月大,我最近也遇到了这个问题。从运行命令中删除--name后,它可以正常工作。我不知道为什么会这样,但是我将其发布在这里,供人们查看在什么地方不必指定名称。

答案 2 :(得分:-1)

在.NET Framework中,UseShellExecute默认情况下处于启用状态。这将更改新进程的当前目录。