Вопрос или проблема
Изучая различные источники, я заметил, что 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, чтобы минимизировать время сборки. Если проблема сохраняется, также рассмотрите возможность использования эмуляции, если это применимо к вашим потребностям.