首页 > 解决方案 > 如何通过 Docker.Dotnet 客户端对 DockerHub 上的私有仓库进行身份验证?

问题描述

我目前正在.NET Standard 中编写一个微服务,它编写一个 Dockerfile,构建与该 Dockerfile 关联的 Docker 映像(这会隐式导致拉取映像),并将映像推送到私有 Docker 注册表。这些 Docker 操作都是使用 MSFT 维护的 Docker.Dotnet 库执行的。我相信这主要是对 Docker Remote API 调用的封装。此微服务的执行上下文位于 AWS 上托管的 K8s 集群中,或者在内部裸机上,具体取决于部署。

以前我们的 Docker 注册表只是内部托管在 Artifactory 上的私有注册表,但我们正在迁移到私有 DockerHub 注册表/存储库/。这种迁移带来了一些身份验证问题。

我们使用 AuthConfig 对所有拉取和推送操作进行身份验证,该 AuthConfig 由与注册表关联的帐户的用户名和密码组成。AuthConfig 要么添加到参数对象,然后传递给调用:

imageBuildParameters.AuthConfigs = new Dictionary<string,
AuthConfig>() { { DockerEnvVariables.DockerRegistry, authConfig } };

…</p>

using (var responseStream = _dockerClient.Images.BuildImageFromDockerfileAsync(tarball, imageBuildParameters).GetAwaiter().GetResult())

或者它(对我来说很奇怪)既传入参数又分别传递给调用:

ImagePushParameters imagePushParameters = new ImagePushParameters() { ImageID = image.Id, RegistryAuth = authConfig, Tag = "latest" };
_dockerClient.Images.PushImageAsync(RepoImage(image.Id), imagePushParameters, authConfig, this).GetAwaiter().GetResult();

我们目前正在为我为 DockerHub 尝试的任何各种 Docker 注册表获取身份验证错误,因此(我已经编辑了组织/命名空间和图像:{“message”:“pull access denied for registry-1.docker .io//, 存储库不存在或可能需要'docker login': denied: 请求访问资源被拒绝”},“error”:“pull access denied for registry-1.docker.io//, repository does不存在或可能需要“docker login”:拒绝:请求的资源访问被拒绝”</p>

我尝试过的 DockerHub url 列表如下,全部带有上述错误或不同的“无效引用格式”错误:

奇怪的是,如果我在我的 Windows 系统上本地运行它,粗体 URL 确实有效。但是,它们在部署到集群时都会失败(与 Docker 套接字/npipe 交互的不同方法?)。

有谁知道我需要设置正确的 URL 以正确验证并与 DockerHub 交互?或者,如果我当前对 Docker.Dotnet 库的实现和使用在某些方面不正确?同样,它与 Artifactory 上的私有 Docker 注册表以及在我的本地 Windows 系统上运行的 DockerHub 一起工作得很好。任何帮助将不胜感激。我可以提供更多必要的信息,无论是代码还是配置。

标签: c#.netdockerdockerhub

解决方案


推荐阅读