使用 GitHub Actions 将容器镜像推送到 GitHub Container Registry
作者:互联网
我的工作中,我构建了很多与客户分享的示例,以向他们展示事情是如何运作的。我的很多客户都对 Azure 容器应用程序感兴趣,所以我希望能够为他们提供带有预构建容器映像的示例,而不必共享整个应用程序源代码(尤其是如果我有一堆的基本微服务,实际上并不需要包含在示例中)。
进入 GitHub 容器注册表!(GHCR) 我看过几个示例存储库,其中从 GHCR 引用了容器图像,但我不知道它是否有效或如何将图像推送到它。事实证明,这相当简单。
在这篇文章中,我将讨论什么是 GHCR,以及我们如何使用 GitHub Actions 将容器镜像推送到它!
什么是 GitHub 容器注册表?
GitHub Container Registry 将容器图像存储在您的组织或个人帐户中,并允许您将图像与存储库相关联。它目前同时支持Docker Image Manifest V2、Schema 2和Open Container Initiative (OCI) 规范。
在 GitHub 中,我们可以在 GitHub Actions 工作流文件中构建我们的 docker 图像并将其推送到 GHCR,并使这些图像私下或公开可用(我将我的图像公开用于我的示例)。
假设我有以下 Dockerfile:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
LABEL org.opencontainers.image.source="https://github.com/willvelida/dapr-store-app"
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["Store/Store.csproj", "Store/"]
RUN dotnet restore "Store/Store.csproj"
COPY . .
WORKDIR "/src/Store"
RUN dotnet build "Store.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Store.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Store.dll"]
这个 Dockerfile 只是构建一个简单的 Blazor Server 应用程序(它是一个非常通用的 Dockerfile,适用于所有 ASP.NET Core 应用程序)。
我们不会将其推送到 Docker Hub 或 Azure 容器注册表,而是设置一个 GitHub Actions 工作流文件以将此容器映像推送到 GHCR。
让我们看一下如何向 GHCR 进行身份验证。
使用 GITHUB_TOKEN 向 GHCR 进行身份验证
向 GHCR 进行身份验证的推荐方法是使用GITHUB_TOKEN
. GitHub 为您提供一个令牌,您可以使用该令牌代表 GitHub Actions 进行身份验证。在每个工作流程运行开始时,GitHub 将自动创建一个唯一的GITHUB_TOKEN
密码以在工作流程中使用,您可以使用它来进行身份验证。
当 GHCR 处于 Beta 阶段时,您可以使用个人访问令牌 (PAT) 进行身份验证。您需要注意您授予 PAT 令牌的权限。随着GITHUB_TOKEN
,这具有将容器图像推送到 GHCR 所需的足够权限
使用个人访问令牌向 GHCR 进行身份验证
我最初使用时确实遇到了一些麻烦GITHUB_TOKEN
,所以为了开始,我使用了 PAT 令牌。要创建一个,请转到Settings/Developer settings,单击Personal access tokens/Tokens (classic)然后单击Generate new token。要将图像推送到 GHCR,您只需要以下权限:
- 阅读:包裹
- 写:包
- 删除:包
创建 PAT 后,您可以将其作为存储库机密存储在包含 Dockerfile 的 GitHub 存储库中。
在您的 GitHub Actions 工作流程文件中,您可以使用以下方式向 GHCR 进行身份验证:
- name: 'Login to GitHub Container Registry'
run: |
echo $CR_PAT | docker login ghcr.io -u <Your-GitHub-username> --password-stdin
由于建议使用GITHUB_TOKEN
而不是 PAT 令牌,因此我们将继续使用它。
创建 GitHub Actions 工作流
现在我们已经有了向 GHCR 进行身份验证的方法,我们可以创建一个 GitHub Actions 工作流文件来推送我们的容器镜像。让我们来看看以下内容:
name: Deploy Images to GHCR
env:
DOTNET_VERSION: '6.0.x'
on:
push:
branches:
- main
workflow_dispatch:
jobs:
push-store-image:
runs-on: ubuntu-latest
defaults:
run:
working-directory: './Store'
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@main
- name: 'Login to GitHub Container Registry'
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{github.actor}}
password: ${{secrets.GITHUB_TOKEN}}
- name: 'Build Inventory Image'
run: |
docker build . --tag ghcr.io/<your-GitHub-username>/store:latest
docker push ghcr.io/<your-GitHub-username>/store:latest