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

问题描述 投票:0回答:5

我正在尝试进行集成测试。在测试初始化阶段,我尝试从 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 退出?

它以编程方式适用于某些图像,但不适用于其他图像。

c# docker process programmatically-created docker-for-windows
5个回答
9
投票

我知道这是一个老问题,显然我来帮助原始发帖人已经太晚了,但由于在搜索 docker 或 podman 的此错误时,这个问题出现在搜索结果的顶部附近,我想我应该添加一个我发现我没有看到提到的其他解决方法(应该适用于 podman 或 docker)。发帖以防对其他人有帮助。

我必须赞扬上面的答案,尤其是 TheECanyon 的答案,它们为我指明了正确的方向,并提到它与通过

--name
有关。也就是说,这并不是什么革命性的事情。这只是 Kit 答案的一个变体,它将删除委托给 docker/podman,而不需要在代码/脚本中进行额外的处理。话又说回来,他的答案或混合方法可能更适合处理奇怪的情况。与其他人一样,我在使用该参数时遇到了此错误,但我没有看到任何有关无法运行容器的常见错误,因为具有该名称的容器已经存在。可能是因为我是从脚本运行它的。

到目前为止我没有看到提及并允许我 keep

--name
参数的是简单地手动删除现有容器(例如
[docker|podman] rm <container-name>
),然后将
--rm
参数添加到运行命令中(例如
[docker|podman] run --rm
)这会导致容器在退出时被删除(实际上,您将在每次运行时重新创建容器,并且 docker/podman 会在停止/退出时删除它)。如果您需要每次运行都使用完全相同的容器,则这可能不起作用,但在我的情况下,所有配置/数据/持久位都存储在已安装的卷上,并在下次运行时重新获取,因此它效果很好,包括在无根容器中。

这个解决方案对我来说比简单地删除名称更好,因为删除名称会导致生成一个新的容器实例每次运行不清理旧的容器实例。如果您只需要在本地开发盒上运行 10 次,那么这没什么大不了的,但从理论上讲,随着时间的推移,这可能会导致一些存储问题,特别是如果您正在执行 100 或 1000 次运行,每次运行都会创建一个新的容器实例。


5
投票

尽管已经过去一个月了,我最近也遇到了这个问题。从运行命令中删除 --name 后,它完美地工作了。我无法弄清楚为什么它会这样,但我将其发布在这里供人们查看可能不需要指定名称的地方。


1
投票

我无法找出无法运行该容器的原因,事实上,其他一些容器也确实发生了这种情况。我仍在寻找答案,但这里有一个解决方法,以防有人需要。

博客文章使用 docker 容器进行集成测试描述了使用 Docker.DotNetNuGet 包需要编写的代码,该包是与 Docker SDK交互的客户端。

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

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

并将其与(我已经在工作的)

stop
rm
命令结合起来,以便在集成测试期间干净地创建和删除容器。


0
投票

就我而言,问题是为容器分配了无效的 IP。

我使用 Python 脚本创建容器并收到错误:

"returned non-zero exit status 125 "

当我手动尝试相同的

"docker run ..."
命令时,我收到了实际的错误消息:
"docker: Error response from daemon: Invalid address X.X.X.X: It does not belong to any of this network's subnets."


-1
投票

在.NET框架中,UseShellExecute默认是开启的。这会更改新进程的当前目录。

© www.soinside.com 2019 - 2024. All rights reserved.