{"meta":{"title":"允许代码空间访问专用注册表","intro":"可以允许 GitHub Codespaces 访问专用注册表中的容器映像或其他包。","product":"Codespaces","breadcrumbs":[{"href":"/zh/codespaces","title":"Codespaces"},{"href":"/zh/codespaces/reference","title":"参考"},{"href":"/zh/codespaces/reference/allowing-your-codespace-to-access-a-private-registry","title":"访问一个专用注册表"}],"documentType":"article"},"body":"# 允许代码空间访问专用注册表\n\n可以允许 GitHub Codespaces 访问专用注册表中的容器映像或其他包。\n\n## 关于私有注册表和 GitHub Codespaces\n\n注册库是用于存储、管理和提取容器映像或其他软件包的安全空间。 有许多注册表，例如：\n\n* GitHub的Container registry、用于容器映像的 Azure 容器注册表 和 DockerHub\n* 用于 Node.js 包的 npm registry。\n\n某些 GitHub Packages 注册表（包括 Container registry）可以配置为允许在创建 codespace 期间，将包无缝拉取到 GitHub Codespaces 中，而无需提供任何身份验证凭据。\n\n若要访问其他容器映像注册表，可以创建机密 GitHub 来存储访问详细信息，以便 GitHub Codespaces 访问存储在该注册表中的映像。\n\n## 使用精细权限访问存储在注册表中的包\n\nGitHub Packages支持细粒度权限的软件包注册表（包括 Container registry）为 GitHub Codespaces 使用软件包提供了最简便的方式。 有关支持细粒度权限和无缝 GitHub Packages 访问的 GitHub Codespaces 注册表列表，请参阅 [关于 GitHub Packages 的权限](/zh/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages)。\n\n### 访问发布到与 codespace 相同存储库的软件包\n\n如果在启动 codespace 的同一存储库中发布包，你将能够在创建 codespace 时自动提取该包。 无需提供任何其他凭据，除非在发布包时未选中“从存储库继承访问权限”选项。\n\n#### 从发布包的存储库继承访问权限\n\n默认情况下，包继承发布它的存储库的访问设置。 例如，如果存储库是公共的，则包也是公共的。 如果存储库是私有的，则包也是私有的，但可以从存储库访问。\n\n此行为由“从存储库继承访问权限”选项控制。 默认情况下，通过\\*\\*\\*\\* 发布时会选中GitHub Actions，但使用personal access token直接发布到注册表时则不会选中。\n\n如果在发布包时未选择“从存储库继承访问权限”选项，则可以手动将存储库添加到已发布包的访问控制中。 有关详细信息，请参阅“[配置包的访问控制和可见性](/zh/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility)”。\n\n### 访问发布到组织、codespace 将在其中启动的包\n\n如果希望组织中的所有 codespace 都可以访问包，建议发布具有内部可见性的包。 这将自动使包对组织内的所有 codespace 可见，除非从中启动 codespace 的存储库是公开的。\n\n如果 codespace 是从引用内部或专用包的公共存储库启动的，则必须手动允许公共存储库访问内部包。 这可以防止内部包意外公开泄露。 有关详细信息，请参阅“[配置包的访问控制和可见性](/zh/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility#ensuring-github-codespaces-access-to-your-package)”。\n\n### 从组织中存储库的子集访问专用包\n\n如果您希望允许组织的部分存储库访问某个包，或者希望在公共存储库中启动的代码空间能够访问内部或私有包，您可以手动将相关存储库添加到该包的访问设置中。 有关详细信息，请参阅“[配置包的访问控制和可见性](/zh/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility#ensuring-github-codespaces-access-to-your-package)”。\n\n### 从代码空间发布软件包\n\n从 codespace 到注册表的无缝访问仅限于拉取包。 如果要在 codespace 中发布包，则必须使用具有 personal access token (classic) 作用域的 `write:packages`。\n\n建议通过 GitHub Actions 发布软件包。 有关详细信息，请参阅 [发布 Docker 映像](/zh/actions/tutorials/publish-packages/publish-docker-images) 和 [发布 Node.js 包](/zh/actions/tutorials/publish-packages/publish-nodejs-packages)。\n\n## 访问存储在其他注册表中的映像\n\n您可以定义密钥，以允许 GitHub Codespaces 访问除 GitHub 的 Container registry 之外的其他容器镜像注册表。 如果您要从不支持无缝访问的注册表中获取容器镜像，GitHub Codespaces 会检查是否存在三个 Secret，它们分别定义该注册表的服务器名称、用户名和 personal access token。 如果找到这些机密， GitHub Codespaces 将使注册表在代码空间内可用。\n\n* `<*>_CONTAINER_REGISTRY_SERVER`\n* `<*>_CONTAINER_REGISTRY_USER`\n* `<*>_CONTAINER_REGISTRY_PASSWORD`\n\n您可以在用户、仓库或组织级别存储密钥，从而在不同的代码空间之间安全地共享它们。 当您为私有映像注册表创建一组密钥时，您需要用一致的标识符替换名称中的 “<\\*>”。 有关详细信息，请参阅 [管理 GitHub Codespaces 的账户专属的机密](/zh/codespaces/managing-your-codespaces/managing-your-account-specific-secrets-for-github-codespaces) 和 [管理存储库或组织的开发环境机密](/zh/codespaces/managing-codespaces-for-your-organization/managing-development-environment-secrets-for-your-repository-or-organization)。\n\n如果您在用户或组织级别设置机密，请确保将这些机密分配到用于创建代码空间的仓库，并从下拉列表中选择访问策略。\n\n<img src=\"/assets/images/help/codespaces/secret-repository-access.png\" alt='Screenshot of the \"Repository access\" dropdown menu with the options \"All repositories,\" \"Private repositories,\" and \"Selected repositories.\"' style=\"width:400px;\"/>\n\n### 将 Docker 映像拉取到代码空间\n\nGitHub Codespaces 使用 Docker，因此，若要在运行时在代码空间中拉取专用 Docker 映像，需要能够使用 Docker-in-Docker。 为实现此目标，系统会自动将登录到 Docker 所需的机密加到 Codespace 中的 `~/.docker/config.json` 文件。 这发生在 `onCreateCommand` 生命周期钩子之后，但在 `postCreateCommand`、`postStartCommand` 和 `postAttachCommand` 之前。 因此，`postCreateCommand` 将能够使用 Docker-in-Docker 将 Docker 映像拉入 codespace，但 `onCreateCommand` 不能。 因此，在预生成过程中，Docker-in-Docker 将不可用。\n\nCodespace 开始运行后，你将能够在 codespace 中打开终端并运行命令 `docker pull PRIVATE-IMAGE-URL`。\n\n### 示例机密\n\n对于Azure中的专用映像注册表，可以创建以下机密：\n\n```shell\nACR_CONTAINER_REGISTRY_SERVER = mycompany.azurecr.io\nACR_CONTAINER_REGISTRY_USER = acr-user-here\nACR_CONTAINER_REGISTRY_PASSWORD = <PERSONAL_ACCESS_TOKEN>\n```\n\n有关通用映像注册表的信息，请参阅[通用映像注册表服务器](#common-image-registry-servers)。 请注意，访问 AWS Elastic Container Registry (ECR) 是不同的。\n\n![存储库的“Codespaces 机密”设置的屏幕截图。 设置了 ACR 容器注册表的三个机密。](/assets/images/help/codespaces/codespaces-image-registry-secret-example.png)\n\n添加机密后，您可能需要停止并启动您所在的代码空间，以便将新的环境变量传递到容器。 有关详细信息，请参阅“[在 GitHub Codespaces 中使用 Visual Studio Code 命令面板](/zh/codespaces/reference/using-the-vs-code-command-palette-in-codespaces#suspending-or-stopping-a-codespace)”。\n\n#### 访问 AWS Elastic Container Registry\n\n若要访问 AWS 弹性容器注册表（ECR），可以提供 AWS 访问密钥 ID 和密钥，并且可以 GitHub 为你检索访问令牌并代表你登录。\n\n```shell\n*_CONTAINER_REGISTRY_SERVER = <ECR_URL>\n*_CONTAINER_REGISTRY_USER = <AWS_ACCESS_KEY_ID>\n*_CONTAINER_REGISTRY_PASSWORD = <AWS_SECRET_KEY>\n```\n\n你还必须确保具有适当的 AWS IAM 权限来执行凭据交换（例如 `sts:GetServiceBearerToken`）以及 ECR 读取操作（`AmazonEC2ContainerRegistryFullAccess` 或 `ReadOnlyAccess`）。\n\n或者，如果不想 GitHub 代表你执行凭据交换，则可以提供通过 AWS API 或 CLI 提取的授权令牌。\n\n```shell\n*_CONTAINER_REGISTRY_SERVER = <ECR_URL>\n*_CONTAINER_REGISTRY_USER = AWS\n*_CONTAINER_REGISTRY_PASSWORD = <TOKEN>\n```\n\n由于这些令牌的生存期较短，需要定期刷新，因此我们建议提供访问密钥 ID 和机密。\n\n尽管这些机密可以具有任何名称，但只要 `*_CONTAINER_REGISTRY_SERVER` 是 ECR URL，仍建议使用 `ECR_CONTAINER_REGISTRY_*`，除非你正在处理多个 ECR 注册表。\n\n有关详细信息，请参阅 AWS ECR 的[专用注册表身份验证文档](https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry_auth.html)。\n\n### 通用映像注册表服务器\n\n下面列出了一些通用映像注册表服务器：\n\n* [DockerHub](https://docs.docker.com/engine/reference/commandline/info/) - `https://index.docker.io/v1/`\n* [GitHub 容器注册表](/zh/packages/working-with-a-github-packages-registry/working-with-the-container-registry) - `ghcr.io`\n* [Azure 容器注册表](https://docs.microsoft.com/azure/container-registry/) - `<registry name>.azurecr.io`\n* [AWS 弹性容器注册表](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html) - `<aws_account_id>.dkr.ecr.<region>.amazonaws.com`\n* [Google Cloud 容器注册表](https://cloud.google.com/container-registry/docs/overview#registries) - `gcr.io` (US)、`eu.gcr.io` (EU)、`asia.gcr.io` (Asia)\n\n## 调试私有镜像库访问\n\n如果在从专用映像注册表中提取映像时遇到问题，请确保能够使用上述机密值运行 `docker login -u <user> -p <password> <server>`。 如果登录失败，请确保登录凭据有效，并且你在服务器上具有提取容器映像的适当权限。 如果登录成功，请确保这些值适当地复制到正确的 GitHub Codespaces 机密中，无论是在用户、存储库还是组织级别，然后重试。"}