Mac(ARM64架构)Docker容器中运行DeepFace时导入模块导致应用异常的问题求助
大家好,我现在遇到了一个在Docker容器里运行DeepFace的棘手问题,折腾了好一阵还是没解决,想请各位帮忙分析分析!
我正在尝试在Docker容器中安装DeepFace来做图片比对,目前已经能把容器搭建起来,但似乎还缺一些关键依赖,或者有架构兼容的问题,导致只要导入DeepFace模块,应用就直接挂住。
具体情况是:在我的main.py里,如果注释掉from deepface import DeepFace这行代码,用命令uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload启动FastAPI服务,应用就能正常跑起来;但只要取消这行的注释,服务启动后就会直接卡住,没有任何后续输出。
我的系统环境
硬件
- MacBook Air(M系列芯片,执行
uname -m输出arm64)
软件
- Docker Desktop 4.39.0(184744),引擎详细信息如下:
Server: Docker Desktop 4.39.0 (184744) Engine: Version: 28.0.1 API version: 1.48 (minimum version 1.24) Go version: go1.23.6 Git commit: bbd0a17 Built: Wed Feb 26 10:40:57 2025 OS/Arch: linux/arm64 Experimental: false containerd: Version: 1.7.25 GitCommit: bcc810d6b9066471b0b6fa75f557a15a1cbf31bb runc: Version: 1.2.4 GitCommit: v1.2.4-0-g6c52b3f docker-init: Version: 0.19.0 GitCommit: de40ad0
- VS Code(最新版本)
项目关键文件内容
.devcontainer/devcontainer.json
{ "name": "AI Devcontainer", "dockerComposeFile": "../docker-compose.yml", "service": "rp", "workspaceFolder": "/usr/src/app", "postCreateCommand": "pip install -r requirements.txt" }
初始版docker-compose.yml
services: rp: container_name: ai platform: linux/amd64 build: . command: sleep infinity networks: - RP volumes: - .:/usr/src/app ports: - '8000:8000' networks: RP: external: true
初始版Dockerfile
# Use the official Python image from the DockerHub FROM python:3.9-slim # Set the working directory in the container WORKDIR /app # Install system dependencies required for DeepFace # Update package list and install dependencies RUN apt update && apt install -y \ tzdata \ libgl1-mesa-glx \ libegl1-mesa \ libxrandr2 \ libxss1 \ libxcursor1 \ libxcomposite1 \ libasound2 \ libxi6 \ libxtst6 \ curl \ ffmpeg \ git \ nano \ gnupg2 \ libsm6 \ wget \ unzip \ libxcb-icccm4 \ libxkbcommon-x11-0 \ libxcb-keysyms1 \ libxcb-render0 \ libxcb-render-util0 \ libxcb-image0 \ python3 \ python3-pip # Install required Qt and X11 libraries RUN apt update && apt install -y \ libx11-xcb1 \ libxcb1 \ libxcomposite1 \ libxkbcommon-x11-0 \ libxkbcommon0 \ libxcb-cursor0 \ libxcb-shape0 \ libxcb-shm0 \ libxcb-sync1 \ libxcb-xfixes0 \ libxcb-xinerama0 \ libxcb-xinput0 \ libxcb-xkb1 # Upgrade pip and install required Python packages RUN python -m pip install --upgrade pip RUN python -m pip install \ onnxruntime==1.15.1 \ numpy==1.21.6 \ h5py \ numexpr \ protobuf==3.20.2 \ opencv-python==4.8.0.74 \ opencv-contrib-python==4.8.0.74 \ pyqt6==6.5.1 \ onnx==1.14.0 \ torch==1.13.1 \ torchvision==0.14.1 # Install dependencies COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt # Copy the rest of the application code into the container COPY . . # Expose port 8000 for the FastAPI app EXPOSE 8000 # Command to run FastAPI with Uvicorn CMD ["sleep", "infinity"]
requirements.txt
fastapi uvicorn requests deepface flask numpy pandas tensorflow-cpu gunicorn pillow opencv-python
main.py核心代码(问题触发点)
import logging logging.basicConfig(level=logging.DEBUG) from fastapi import FastAPI, HTTPException import uvicorn import requests import numpy as np import os import socket import base64 from typing import List, Dict, Union # # 就是这行代码导致应用挂住 # from deepface import DeepFace app = FastAPI(title="RP AI Documentation", docs_url="/api-docs") @app.on_event("startup") async def startup_event(): print("Starting up...") # Simulate any heavy lifting during startup if needed print("Startup finished!") if __name__ == "__main__": print("Starting app...") uvicorn.run(app, host="0.0.0.0", port=8000) print("App started!") # 图片比对的核心函数 def compare_faces_with_deepface(img_path1: str, img_path2: str) -> bool: try: result = DeepFace.verify(img_path1, img_path2) return result["verified"] except Exception as e: raise HTTPException(status_code=500, detail=f"Error during face comparison: {str(e)}") # 其他辅助处理函数...
我遇到的具体错误和尝试过的方法
初始环境下的错误
在VS Code中加载Dev Container,容器构建完成后运行启动命令,会输出以下内容然后直接挂住,没有任何后续日志:
root@1f6928173e34:/usr/src/app# uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload INFO: Will watch for changes in these directories: ['/usr/src/app'] INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) INFO: Started reloader process [1104] using StatReload INFO:numexpr.utils:NumExpr defaulting to 8 threads.
尝试1:叠加DeepFace官方镜像
我修改了Dockerfile的开头,同时使用Python基础镜像和DeepFace官方镜像,结果启动应用后,取消注释DeepFace导入语句,服务重载时出现了TensorFlow的错误:
WARNING: StatReload detected changes in 'app/main.py'. Reloading... INFO: Shutting down INFO: Waiting for application shutdown. INFO: Application shutdown complete. INFO: Finished server process [523] The TensorFlow library was compiled to use AVX instructions, but these aren't available on your machine.
尝试2:仅用DeepFace官方镜像并移除AMD64强制配置
看到有评论说可能是platform: linux/amd64的问题(因为我的Mac是ARM64架构),所以我做了两个调整:
- Dockerfile:只使用官方DeepFace镜像,去掉了之前手动安装的大量系统依赖
- docker-compose.yml:移除了
platform: linux/amd64配置
但修改后,取消注释DeepFace的导入语句,应用还是会和初始情况一样挂住,没有任何报错信息。
现在我实在摸不着头绪了,到底是ARM64和DeepFace/TensorFlow的兼容问题?还是我漏掉了某些必须的系统依赖?或者是TensorFlow的版本编译不支持ARM64?希望有过类似经验的朋友能给我一些思路或者解决方案,非常感谢!
备注:内容来源于stack exchange,提问作者MrLister

