Установите Docker Desktop и собирайте на macos-latest GitHub Actions

Вопрос или проблема

Изучая различные источники, я заметил, что Docker явно не работает на машинах M1. Локально я могу запускать Docker Desktop. Я думал, что смогу запустить его для сборки своего образа через GitHub Actions и загрузки в GHCR. Сборка кросс-платформенно на ubuntu-latest действительно работает, но время сборки занимает очень много времени, и мне бы хотелось поэкспериментировать с нативной сборкой на ARM64. Это мой текущий рабочий процесс:

name: Сборка Docker-образа для бэкенда

on:
  push:
    branches: [ "main" ]

jobs:
  build:
    runs-on: macos-latest

    steps:
      - name: Выгрузка репозитория
        uses: actions/checkout@v4

      - name: Запуск Docker
        run: |
          brew install --cask docker
          open /Applications/Docker.app
          
          TIMEOUT=120
          INTERVAL=5
          for i in $(seq 1 $((TIMEOUT / INTERVAL))); do
           if docker info > /dev/null 2>&1; then
             echo "Docker запущен."
             break
           fi
           echo "Ожидание запуска Docker..."
           sleep $INTERVAL
          done
          docker info

      - name: Настройка Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Кэширование слоев Docker
        uses: actions/cache@v3
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-buildx-

      - name: Вход в GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Сборка и загрузка Docker-образа
        uses: docker/build-push-action@v5
        with:
          context: .
          file: ./backend.dockerfile
          push: true
          tags: |
            ghcr.io/me/repo:v0
            ghcr.io/me/repo:latest
          platforms: linux/arm64

      - name: Очистка после работы
        if: always()
        run: |
          docker system prune -f

Однако я продолжаю получать ошибку о том, что Docker не работает. Я делаю что-то не так?

Ответ или решение

Установка Docker Desktop и сборка на GitHub Actions для macOS

Введение

Docker предоставляет мощный инструмент для создания контейнеризованных приложений, но его работа на архитектуре ARM64, особенно на машинах Apple с M1, может вызывать определенные трудности. В вашем вопросе описывается проблема с запуском Docker на GitHub Actions, когда вы пытаетесь выполнять сборку на macos-latest. Здесь мы рассмотрим, как корректно настроить окружение, чтобы избежать ошибки "Docker не запущен".

Понимание Проблемы

На данный момент Docker Desktop действительно может работать некорректно на архитектуре ARM64 в окружении CI/CD. Основная проблема, с которой вы сталкиваетесь, заключается в том, что служба Docker может не успеть завершить инициализацию, прежде чем ваше последующее действие пытается получить к ней доступ. Это может привести к сообщениям об ошибке.

Решение Проблемы

Ниже приведены шаги по модификации вашего рабочего процесса в GitHub Actions, чтобы гарантировать, что Docker инициализируется корректно и доступен до выполнения любых команд.

1. Установка Docker

Вместо установки Docker через brew, мы можем попробовать воспользоваться системной командой для запуска Docker, если это возможно. Однако, я рекомендую продолжать использовать brew, так как это общепринятый метод для установки приложений на macOS.

2. Увеличение времени ожидания

Если Docker не успевает запуститься в течение предоставленного интервала ожидания, вам нужно будет увеличить лимиты времени, чтобы удостовериться, что служба готова к использованию.

Обновленный YAML файл

Ниже приведен обновленный файл .github/workflows/docker-build.yaml, учитывающий вышеописанные рекомендации:

name: Build backend Docker image

on:
  push:
    branches: [ "main" ]

jobs:
  build:
    runs-on: macos-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Start Docker
        run: |
          brew install --cask docker
          open /Applications/Docker.app

          # Увеличение времени ожидания до 300 секунд
          TIMEOUT=300
          INTERVAL=5
          for i in $(seq 1 $((TIMEOUT / INTERVAL))); do
           if docker info &> /dev/null; then
             echo "Docker is running."
             break
           fi
           echo "Waiting for Docker to start..."
           sleep $INTERVAL
          done
          docker info

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Cache Docker layers
        uses: actions/cache@v3
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-buildx-

      - name: Log in to GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v5
        with:
          context: .
          file: ./backend.dockerfile
          push: true
          tags: |
            ghcr.io/me/repo:v0
            ghcr.io/me/repo:latest
          platforms: linux/arm64

      - name: Post job clean up
        if: always()
        run: |
          docker system prune -f

Заключение

Теперь вы можете проверить работу вашего рабочего процесса. Увеличив время ожидания и удостоверившись, что Docker полностью инициализирован, вы должны избежать ошибок, связанных с его недоступностью. Также рекомендуется убедиться, что ваш backend.dockerfile корректно настроен для архитектуры ARM64, чтобы минимизировать время сборки. Если проблема сохраняется, также рассмотрите возможность использования эмуляции, если это применимо к вашим потребностям.

Оцените материал
Добавить комментарий

Капча загружается...