从 Windows 上的 C# Service Fabric 应用程序连接到 docker_engine(命名管道)

Posted

技术标签:

【中文标题】从 Windows 上的 C# Service Fabric 应用程序连接到 docker_engine(命名管道)【英文标题】:Connect to docker_engine (named pipe) from a C# Service Fabric app on Windows 【发布时间】:2020-02-13 18:56:38 【问题描述】:

我有一个无状态 Service Fabric 项目 (.NET Core),我需要从中启动 Docker 作业。我正在使用Docker.DotNet,以下代码在小型控制台应用程序中运行良好,但在 Service Fabric 中无法运行:

var dockerClient = new DockerClientConfiguration(new Uri("npipe://./pipe/docker_engine")).CreateClient();

// error occurs on next line (in Service Fabric)...
dockerClient.Images
    .CreateImageAsync(new ImagesCreateParameters
    
        FromImage = "jbarlow83/ocrmypdf",
        Tag = "latest"
    ,
        new AuthConfig(),
        new Progress<JSONMessage>());

如果我尝试从 Stateless SF 项目运行 Service Fabric Explorer,则会看到此错误:

System.UnauthorizedAccessException: Access to the path is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.Pipes.NamedPipeClientStream.ConnectInternal(Int32 timeout, CancellationToken cancellationToken, Int32 startTime)
   at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Docker.DotNet.DockerClient.<>c__DisplayClass6_0.<<-ctor>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Net.Http.Client.ManagedHandler.d__33.MoveNext()

我不确定这是否真的是一个权限问题,或者它是否与 Service Fabric 网络隔离的工作方式有关。

我正在我的本地开发实例上尝试这个,最终(希望)会进入本地设置。

有没有办法访问托管 SF 应用程序的节点上的命名管道?或者也许是通过 .NET Core SF 应用程序运行 Docker 的另一种建议方式?

【问题讨论】:

【参考方案1】:

我今天遇到这个问题时遇到了这个问题,如果您不想切换离开命名管道连接,最终会偶然发现一个不同的解决方案。如果您将 Service Fabric 服务设置为作为 LocalSystem 帐户而不是默认帐户运行,它应该也能正常工作。

您可以按照说明here 在清单中更改您的无状态服务运行的帐户

这是因为根据this article on Named Pipes,只有某些类型的帐户才能访问命名管道,其中之一是 LocalSystem。

【讨论】:

您知道我们如何创建一个新的 LocalSystem 帐户吗?【参考方案2】:

我能够通过将我的 DockerClientConfiguration 行更改为不再使用命名管道,而是使用 http://localhost:2375 来完成这项工作:

var dockerClient = new DockerClientConfiguration(new Uri("http://localhost:2375")).CreateClient();

然后在 Docker CE 常规设置中启用 Expose daemon on tcp://localhost:2375 without TLS

【讨论】:

以上是关于从 Windows 上的 C# Service Fabric 应用程序连接到 docker_engine(命名管道)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Amazon Web Services (EC2) 和 c# Windows Service/WCF 进行远程调试

如何从 Windows Mobile 上的 C# 文件中获取修改日期?

C#创建Windows Service(Windows 服务)基础教程

将 C# Stateful Service Fabric 应用程序从 Visual Studio 部署到 Linux

C#创建Windows Service(Windows 服务)基础教程

c# topshelf 编写windows service