从 Windows 上的 C# Service Fabric 应用程序连接到 docker_engine(命名管道)
Connect to docker_engine (named pipe) from a C# Service Fabric app on Windows
我有一个无状态 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>());
如果我尝试从无状态 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 的另一种建议方法?
我可以通过将 DockerClientConfiguration
行更改为不再使用命名管道,而是使用 http://localhost:2375
:
来实现此功能
var dockerClient = new DockerClientConfiguration(new Uri("http://localhost:2375")).CreateClient();
然后在 Docker CE 常规设置中启用 在 tcp://localhost:2375 上不使用 TLS 公开守护程序:
我今天 运行 解决这个问题时刚好遇到这个问题,如果您不想从命名管道连接切换,最终会遇到不同的解决方案。如果您将 Service Fabric 服务设置为 运行 作为本地系统帐户而不是默认帐户,它应该也能正常工作。
您可以按照说明here更改清单
中无状态服务运行的帐户
这是可行的,因为根据 this article on Named Pipes,只有某些类型的帐户可以访问命名管道,其中之一是 LocalSystem。
我有一个无状态 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>());
如果我尝试从无状态 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 的另一种建议方法?
我可以通过将 DockerClientConfiguration
行更改为不再使用命名管道,而是使用 http://localhost:2375
:
var dockerClient = new DockerClientConfiguration(new Uri("http://localhost:2375")).CreateClient();
然后在 Docker CE 常规设置中启用 在 tcp://localhost:2375 上不使用 TLS 公开守护程序:
我今天 运行 解决这个问题时刚好遇到这个问题,如果您不想从命名管道连接切换,最终会遇到不同的解决方案。如果您将 Service Fabric 服务设置为 运行 作为本地系统帐户而不是默认帐户,它应该也能正常工作。
您可以按照说明here更改清单
中无状态服务运行的帐户这是可行的,因为根据 this article on Named Pipes,只有某些类型的帐户可以访问命名管道,其中之一是 LocalSystem。