Github Actions 在 ARM64 上构建 Docker 映像 (macos-latest-xlarge)

Uri*_*Uri 8 macos github docker dockerfile github-actions

创建了一个 github 操作,用于为arm64平台构建docker镜像以快速构建它(无模拟)我使用macos-latest-xlargearm64机器

github操作代码示例如下:

name: Mac OS Issue
on:
  workflow_dispatch:

jobs:
  macos_issue:
    name: Check Issue
    runs-on: macos-latest-xlarge
    steps:
      - name: Check Issue
        id: check_issue
        run: |
          set +e
          brew install docker docker-buildx
          docker --version
          echo "FROM ubuntu:latest" > Dockerfile
          docker build --no-cache -t test .
Run Code Online (Sandbox Code Playgroud)

运行时失败并出现以下错误

ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Run Code Online (Sandbox Code Playgroud)

我尝试使用 macos-latest 进行模拟,但速度非常慢。所以一定是arm64机器

Von*_*onC 0

根据您的 GitHub Actions 工作流程,您正尝试在 macOS 运行程序 ( macos-latest-xlarge) 上构建 Docker 映像,该运行程序似乎是 ARM64 计算机。但是,您会看到一条错误,表明 Docker 守护进程未运行。

+---------------------+        +------------------+
| GitHub Actions      |        | macOS ARM64      |
| Workflow            |  SSH   | Runner           |
|                     |------->| (macos-latest-   |
| - Build Docker Image|        | xlarge)          |
| - ARM64 Platform    |        |                  |
+---------------------+        +------------------+
Run Code Online (Sandbox Code Playgroud)

与评论类似,我首先检查 Docker 是否已正确安装并在 macOS 运行器上运行。您可能需要显式启动 Docker 服务,因为默认情况下它在 macOS 运行器上不会启动。

GitHub Action 代码将是(作为问题 1456中提到的colima方法的替代方法):

name: Mac OS Issue
on:
  workflow_dispatch:

jobs:
  macos_issue:
    name: Check Issue
    runs-on: macos-latest-xlarge
    steps:
      - name: Install Docker
        run: |
          brew install --cask docker

      - name: Start Docker
        run: |
          # Start Docker.app if not already running
          if ! pgrep -f Docker.app; then
            open -a /Applications/Docker.app
            # Wait for Docker to be ready
            while ! docker info >/dev/null 2>&1; do sleep 1; done
          fi

      - name: Build Docker Image
        run: |
          echo "FROM ubuntu:latest" > Dockerfile
          docker build --no-cache -t test .
Run Code Online (Sandbox Code Playgroud)

open --background -a Docker命令在后台启动 Docker。例如,我在Abhimanyu Bajaj的“使用 Kind 和 AppDynamics 构建和监控 Kubernetes 集群”中看到了这种方法。 循环等待 Docker 守护进程准备就绪。
while ! docker system info > /dev/null 2>&1; do sleep 1; done


我通过https://github.com/lhotari/action-upterm运行连接到 mac 实例的命令脚本:Docker.app正在运行但docker info返回错误

ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock.
Run Code Online (Sandbox Code Playgroud)

该错误应表明 Docker CLI 无法与 Docker 守护程序通信。这可能是因为 Docker 守护进程未运行,或者存在权限问题。

由于您已Docker.app通过 确认 Docker 守护进程正在 macOS 实例上运行action-upterm,因此请确保 Docker 守护进程本身处于活动状态。您可以尝试重启Docker服务。

在 macOS 上,当前用户可能没有与 Docker 守护进程交互所需的权限。如果需要,检查并修改权限。(id -a:至少寻找一个名为 的组docker

GitHub Action 代码为:

ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock.
Run Code Online (Sandbox Code Playgroud)

由于您可以通过 action-upterm 访问 macOS 实例,因此可以使用此访问权限手动检查 Docker 的状态并以交互方式进行故障排除。并检查 Docker 日志以获取线索。确保没有环境变量干扰 Docker 的操作。


正在Docker.app运行但docker info从未成功

尽管Docker.app看起来正在运行,但它可能并未完全发挥作用。检查其状态和日志是否有任何问题。

name: Mac OS Issue
on:
  workflow_dispatch:

jobs:
  macos_issue:
    name: Check Issue
    runs-on: macos-latest-xlarge
    steps:
      - name: Install and Start Docker
        run: |
          brew install --cask docker
          open -a Docker

      - name: Check Docker Daemon
        run: |
          # Make sure Docker Daemon is running
          if ! docker info; then
            echo "Restarting Docker..."
            osascript -e 'quit app "Docker"'
            sleep 5
            open -a Docker
            # Wait for Docker to be ready
            while ! docker info >/dev/null 2>&1; do sleep 1; done
          fi

      - name: Build Docker Image
        run: |
          echo "FROM ubuntu:latest" > Dockerfile
          docker build --no-cache -t test .
Run Code Online (Sandbox Code Playgroud)

由于您可以通过 action-upterm 交互式访问 macOS 实例,因此可以使用它手动执行这些故障排除步骤。这可以提供即时反馈并更好地了解正在发生的事情。

macOS 运行器上的系统日志可能会提供有关问题所在的更多详细信息。这可能包括 Docker 启动期间的错误或特定 Docker 组件的问题。

Docker 守护程序日志可能包含详细的错误消息(位于/var/log/docker.log或类似位置)。

如果安装在某种程度上已损坏或配置错误,卸载然后重新安装 Docker 可能会有所帮助。