Docker部署gunicorn后端容器报exec format error持续重启问题
问题现象
在Windows 10 19044.1766、Intel Ice Lake架构Ubuntu服务器上使用docker-compose部署服务时,backend容器持续重启,报错信息如下:
standard_init_linux.go:228: exec user process caused: exec format error
根本原因
该报错的核心触发逻辑是操作系统内核无法识别待执行程序的二进制格式。结合双环境复现的特征,问题根源是 CI构建出的Docker镜像架构与运行环境CPU架构不匹配:
- GitHub Actions工作流中配置Docker Buildx构建时,未显式指定目标构建平台,默认会匹配CI运行器自身的CPU架构输出镜像。当前GitHub Actions的ubuntu-latest运行器已部分轮换为ARM64架构,构建生成的ARM架构镜像无法在x86/amd64架构的设备上运行,直接触发格式错误。
- 此前更换Python基础镜像版本、调整gunicorn启动参数的操作均未涉及架构匹配的核心问题,因此修改后报错无任何变化。
- 原有配置中存在两处非核心瑕疵:一是初始Dockerfile的CMD参数中
"--bind,"多了尾部逗号,二是gunicorn绑定地址写为0:8000不符合规范,正确写法为0.0.0.0:8000,这两处问题不会触发当前的exec格式报错,但会导致服务启动后端口监听异常。
修复步骤
- 修改GitHub Actions工作流中的镜像构建配置,显式指定构建适配x86架构的Linux镜像,修正后的构建步骤配置如下:
- name: Push to Docker Hub uses: docker/build-push-action@v2 with: push: true context: ./backend/ platforms: linux/amd64 tags: ${{ secrets.DOCKER_USERNAME }}/foodgram:latest
如果后续需要兼容ARM架构服务器,可将platforms字段改为linux/amd64,linux/arm64构建多架构镜像。
- 修正backend目录下的Dockerfile内容,去除CMD参数的多余符号、使用规范的监听地址,最终参考配置:
FROM python:3.8-slim WORKDIR /app COPY requirements.txt . RUN pip install --upgrade pip RUN pip install -r requirements.txt --no-cache-dir COPY . /app CMD ["gunicorn", "foodgram.wsgi:application", "--bind", "0.0.0.0:8000"]
- 提交代码触发CI重新构建并推送镜像到Docker Hub后,在本地和服务器端清除旧容器缓存,拉取新镜像重新启动,执行命令如下:
sudo docker pull mastermind777nest/foodgram:latest sudo docker-compose down sudo docker-compose up -d
验证方式
- 执行
sudo docker ps查看容器列表,若backend容器状态显示为Up而非Restarting,说明核心问题已修复。 - 执行
sudo docker logs <backend容器ID>查看gunicorn运行日志,确认服务正常监听8000端口即可。
内容的提问来源于stack exchange,提问作者MasterMind
相关产品推荐
相关产品推荐

