在 Mac Apple Silicon M2 上运行 Docker 容器:平台兼容性和执行错误 (linux/arm64)

geo*_*riv 3 docker arm64 docker-compose apple-silicon apple-m2

我是 macOS 和 Docker 的新手。当我尝试在 Apple Silicon M2 上使用 Docker 启动我的项目时,遇到了一系列障碍。我认为我面临的问题与图像之间的不良兼容性有关:webdevops/php-apache-dev:7.2 和我正在使用的平台。

\n

我的 docker-compose.yml 如下所示:

\n
version: "3"\nservices:\n  web:\n    image: webdevops/php-apache-dev:7.2\n
Run Code Online (Sandbox Code Playgroud)\n

另外,我在某些方面对其进行了更改以添加:

\n
version: "3"\nservices:\n  web:\n    platform:linux/amd64\n    image: webdevops/php-apache-dev:7.2\n
Run Code Online (Sandbox Code Playgroud)\n

但不断出现错误。

\n

我不知道还能尝试什么。如果您有任何见解或解决方案可以分享,我将非常感谢您的指导!

\n

当我启动 docker-compose up 时,我在 my_project 容器内收到一条错误消息,如下所示:

\n
goroutine 1 [running]:\nruntime.systemstack_switch()\n    /usr/local/Cellar/go/1.8.1/libexec/src/runtime/asm_amd64.s:281 fp=0xc420028788 sp=0xc420028780\nruntime.main()\n    /usr/local/Cellar/go/1.8.1/libexec/src/runtime/proc.go:127 +0x6c fp=0xc4200287e0 sp=0xc420028788\nruntime.goexit()\n    /usr/local/Cellar/go/1.8.1/libexec/src/runtime/asm_amd64.s:2197 +0x1 fp=0xc4200287e8 sp=0xc4200287e0\nmy_project exited with code 2\n\n
Run Code Online (Sandbox Code Playgroud)\n

为了排除故障,我尝试将 platform: linux/amd64 密钥添加到 docker-compose.yml 文件中的 Web 服务。然而,这导致了另一个障碍:

\n
Error response from daemon: image with reference webdevops/php-apache-dev:7.2 was found but does not match the specified platform: wanted linux/arm64/v8, actual: linux/amd64\n
Run Code Online (Sandbox Code Playgroud)\n

切换齿轮,我尝试将图像更改为 webdevops/php-apache-dev:7.4,但这又导致我出现另一个错误:

\n
[+] Running 1/1\n \xe2\x9c\x98 web Error                                                                                                                           20.2s\nError response from daemon: Get "https://registry-1.docker.io/v2/": proxyconnect tcp: dial tcp: lookup http.docker.internal on 192.168.65.7:53: read udp 192.168.0.1:49962->192.168.65.7:53: i/o timeout\n
Run Code Online (Sandbox Code Playgroud)\n

CYB*_*B3R 5

正如您正确指出的那样,此错误的原因是平台不兼容。目前,您尝试使用的映像仅适用于 amd64 平台,该平台只能通过仿真在 M2 处理器上运行。为了启用 Rosetta2 进行仿真,您需要运行以下命令:

softwareupdate --install-rosetta
Run Code Online (Sandbox Code Playgroud)

但是,没有为您的平台构建此映像并不意味着您绝对必须依赖仿真。Dockerfile 可用于此映像(但是,Docker Hub 上的任何位置均未标明其位置),您可以为您的平台构建它。

最后,如果您不依赖此特定映像,最简单的选择是找到提供相同软件并为您的平台构建的替代映像。例如,webhippie/php-apachesilarhi/php-apache是为 arm64 构建的,可以在不依赖仿真的情况下本地工作。

  • 对于任何在运行“softwareupdate --install-rosetta”命令时遇到问题的人,请参阅本文:https://support.apple.com/en-us/HT211861 然后确保您的终端应用程序配置为使用 Rosetta 运行(该文章中的示例适用于 Safari)。 (2认同)