Skip to main content

允许代码空间访问私有映像注册表

你可以使用密钥允许 GitHub Codespaces 访问私有映像注册表

关于私人映像注册表和 GitHub Codespaces

注册表是用于存储、管理和提取专用容器映像的安全空间。 您可以使用一个来存储一个或多个映像。 注册表的示例很多,例如 Container registry、npm registry、Azure 容器注册表或 DockerHub。

Container registry and npm registry 可以配置为允许在创建 codespace 期间无缝地将容器映像拉取到 GitHub Codespaces 中,而无需提供任何身份验证凭据。 对于其他映像注册表,必须在 GitHub 中创建机密以存储访问详细信息,这将允许 GitHub Codespaces 访问存储在该注册表中的映像。

访问存储在 Container registry and npm registry 中的映像

Container registry and npm registry 为 GitHub Codespaces 使用开发容器映像提供了最简单的方法。

有关详细信息,请参阅“使用容器注册表”和“使用 npm 注册表”。

访问发布到与代码空间相同的仓库的映像

如果将容器映像发布到启动 codespace 的相同存储库中的 Container registry or npm registry,你将能够在创建 codespace 时自动提取该映像。 无需提供任何其他凭据,除非在发布容器映像时未选中“从存储库继承访问权限”选项。

从发布映像的仓库继承访问权限

默认情况下,将容器映像发布到 Container registry or npm registry 时,该映像将继承从中发布映像的存储库的访问设置。 例如,如果仓库是公共的,则映像也是公共的。 如果仓库是私有的,则映像也是私有的,但可以从仓库访问。

此行为由“从存储库继承访问权限”选项控制。 通过 GitHub Actions 发布时,默认情况下会选择“从存储库继承访问权限”,但在使用 personal access token 直接发布到 Container registry or npm registry 时,不会选择该选项。

如果在发布映像时未选择“从存储库继承访问权限”选项,则可以手动将存储库添加到已发布容器映像的访问控制中。 有关详细信息,请参阅“配置包的访问控制和可见性”。

访问发布到组织、代码空间将在 其中启动的映像

如果希望组织中的所有代码空间都可以访问容器映像,建议发布具有内部可见性的容器映像。 这将自动使映像对组织内的所有代码空间可见,除非从中启动代码空间的仓库是公开的。

如果代码空间是从引用内部或私有映像的公共公共仓库启动的,则必须手动允许公共公共仓库访问内部容器映像。 这可以防止内部映像意外公开泄露。 有关详细信息,请参阅“确保 Codespace 访问你的包”。

从组织中仓库的子集访问私有容器

如果要允许组织的存储库子集访问容器映像,或者允许从在公共存储库中启动的 codespace 访问内部或专用映像,则可以手动将存储库添加到容器映像的访问设置。 有关详细信息,请参阅“确保 Codespace 访问你的包

从代码空间发布容器映像

从 codespace 到 Container registry or npm registry 的无缝访问仅限于拉取容器映像。 如果要从 codespace 内部发布容器映像,则必须结合使用 personal access token (classic) 与 write:packages 作用域。

我们建议通过 GitHub Actions 发布映像。 有关详细信息,请参阅“发布 Docker 映像”和“发布 Node.js 包”。

访问存储在其他容器注册表中的映像

如果要从不是 Container registry or npm registry 的注册表访问容器映像,GitHub Codespaces 将检查是否存在三个机密,这些机密定义了容器注册表的服务器名称、用户名和 personal access token。 如果找到这些密钥,GitHub Codespaces 将在 codespace 中提供注册表。

  • <*>_CONTAINER_REGISTRY_SERVER
  • <*>_CONTAINER_REGISTRY_USER
  • <*>_CONTAINER_REGISTRY_PASSWORD

您可以在用户、仓库或组织级别存储密钥,从而在不同的代码空间之间安全地共享它们。 当您为私有映像注册表创建一组密钥时,您需要用一致的标识符替换名称中的 “<*>”。 有关详细信息,请参阅“管理 codespace 的加密机密”和“管理 GitHub Codespaces 的存储库和组织的加密机密”。

如果您在用户或组织级别设置机密,请确保将这些机密分配到仓库,您将从下拉列表中选择访问策略来创建代码空间。

映像注册表密钥示例

示例机密

如果您在 Azure 中拥有私有映像注册表,则可以创建以下机密:

ACR_CONTAINER_REGISTRY_SERVER = mycompany.azurecr.io
ACR_CONTAINER_REGISTRY_USER = acr-user-here
ACR_CONTAINER_REGISTRY_PASSWORD = <PERSONAL_ACCESS_TOKEN>

有关通用映像注册表的信息,请参阅“通用映像注册表服务器”。 请注意,访问 AWS Elastic Container Registry (ECR) 是不同的。

映像注册表密钥示例

添加机密后,您可能需要停止并启动您所在的代码空间,以便将新的环境变量传递到容器。 有关详细信息,请参阅“暂停或停止 codespace”。

访问 AWS Elastic Container Registry

要访问 AWS 弹性容器注册表 (ECR),您可以提供 AWS 访问密钥 ID 和私有密钥,GitHub 可以为您检索访问令牌并代表您登录。

*_CONTAINER_REGISTRY_SERVER = <ECR_URL>
*_CONTAINER_REGISTRY_USER = <AWS_ACCESS_KEY_ID>
*_CONTAINER_REGISTRY_PASSWORD = <AWS_SECRET_KEY>

你还必须确保具有适当的 AWS IAM 权限来执行凭据交换(例如 sts:GetServiceBearerToken)以及 ECR 读取操作(AmazonEC2ContainerRegistryFullAccessReadOnlyAccess)。

或者,如果您不希望 GitHub 代表您执行凭证交换,则可以提供通过 AWS 的 API 或 CLI 获取的授权令牌。

*_CONTAINER_REGISTRY_SERVER = <ECR_URL>
*_CONTAINER_REGISTRY_USER = AWS
*_CONTAINER_REGISTRY_PASSWORD = <TOKEN>

由于这些令牌的生存期较短,需要定期刷新,因此我们建议提供访问密钥 ID 和机密。

尽管这些机密可以具有任何名称,但只要 *_CONTAINER_REGISTRY_SERVER 是 ECR URL,仍建议使用 ECR_CONTAINER_REGISTRY_*,除非你正在处理多个 ECR 注册表。

有关详细信息,请参阅 AWS ECR 的“专用注册表身份验证文档”。

通用映像注册表服务器

下面列出了一些通用映像注册表服务器:

调试私有映像注册表访问

如果在从专用映像注册表中提取映像时遇到问题,请确保能够使用上述机密值运行 docker login -u <user> -p <password> <server>。 如果登录失败,请确保登录凭据有效,并且您在服务器上具有提取容器映像的适当权限。 如果登录成功,请确保将这些值适当地复制到正确的 GitHub Codespaces 机密中,无论是在用户、仓储库还是组织级别,然后重试。