Отправка изображений контейнеров в реестр контейнеров GitHub с помощью действий GitHub
GitHub Container Registry хранит образы контейнеров в вашей организации или личной учетной записи и позволяет связать образ с репозиторием. В настоящее время он поддерживает спецификации Docker Image Manifest V2, Schema 2 и Open Container Initiative (OCI).
В GitHub мы можем создавать и отправлять наши образы докеров в GHCR в файле рабочего процесса GitHub Actions и делать эти образы доступными либо в частном порядке, либо публично (я делаю свои образы общедоступными для своих примеров).
Допустим, у нас есть следующий 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 (это довольно общий файл Dockerfile для всех ASP.NET Основные приложения).
Вместо того, чтобы отправлять это в Docker Hub или Azure Container Registry, мы собираемся настроить файл рабочего процесса GitHub Actions для отправки этого образа контейнера в GHCR.
Давайте посмотрим, как мы можем пройти аутентификацию в GHCR.
Использование GITHUB_TOKEN для аутентификации в GHCR
Рекомендуемый метод аутентификации в GHCR - использовать GITHUB_TOKEN
. GitHub предоставляет вам токен, который вы можете использовать для аутентификации от имени GitHub Actions. В начале каждого запуска рабочего процесса GitHub автоматически создает уникальный секрет GITHUB_TOKEN
для использования в рабочем процессе, который вы можете использовать для аутентификации.
Когда GHCR был в бета-версии, вы могли использовать личный токен доступа (PAT) для аутентификации. Вам нужно было бы быть осторожным с разрешениями, которые у вас есть на выбранном PAT. С GITHUB_TOKEN
это поставляется с достаточными разрешениями, необходимыми для отправки изображений контейнеров в GHCR
Использование личного Token доступа для аутентификации в GHCR
Изначально у вас могут возникнуть некоторые проблемы с использованием GITHUB_TOKEN
, поэтому для начала используем токен PAT. Чтобы создать его, перейдите в Настройки/Настройки разработчика, нажмите на личные token доступа/Tokens (classic), а затем нажмите на Сгенерировать новый token. Чтобы отправлять изображения в GHCR, вам нужны только следующие разрешения:
- read:packages
- write:packages
- delete:packages
После того, как вы создали PAT, вы можете сохранить его как секрет репозитория внутри вашего репозитория GitHub, который содержит ваш файл Dockerfile.
Затем в вашем файле рабочего процесса 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
Теперь, когда у нас есть способ аутентификации в GHC, мы можем создать файл рабочего процесса 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
Наиболее важные шаги, которые следует выделить, — это аутентификация в GHCR, а затем отправка образа контейнера.
Для аутентификации мы можем использовать docker/login-action
, нацелить ghrc.io в качестве реестра и используйте свое имя пользователя (переданное как ${{ github.actor }}
) и наш GITHUB_TOKEN
в качестве пароля.
Как только мы пройдем аутентификацию, мы сможем пометить ваше изображение, используя формат ghcr.io/<your-github-username>/<image-name>:<image-version>
.
Делаем наш образ общедоступным
Теперь по умолчанию, когда мы публикуем пакет, видимость будет закрытой. Вы можете сохранить свои изображения в секрете, если хотите, но для моих образцов я хочу, чтобы они были общедоступны.
Чтобы сделать их доступными для нашего репозитория, нам нужно добавить команду LABEL
в наш Dockerfile. Вы должны сделать это под первой командой FROM
следующим образом:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
LABEL org.opencontainers.image.source="https://github.com/<your-github-username>/<your-repo-name>"
Это сделает наши изображения видимыми на главной странице нашего репозитория, вот так:
Нажмите на пакет, который вы хотите сделать общедоступным, затем перейдите в Package Settings. В опасной зоне (подсказка Кенни Логгинса) нажмите "change visibility" и выберите "Public", например так:
Теперь, когда наш пакет общедоступен, мы можем извлечь его с помощью docker pull следующим образом:
docker pull ghcr.io/willvelida/store:latest
Заключение
В этом посте мы говорили о том, что такое GHC, как мы можем аутентифицировать изображения и отправлять их на него с помощью действий на GitHub, а затем публиковать эти изображения.
Это должно помочь вам с публикацией изображений контейнеров в реестре контейнеров GitHub. Для изображений частных контейнеров по-прежнему можно использовать Azure Container Registry, но аутентификация и отправка изображений в GHC для целей образцов выглядит как правильный путь.