You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器部署至Heroku时遭遇405 Method Not Allowed错误求助

Heroku容器部署Flask+LangChain应用出现405 Method Not Allowed错误排查

问题描述

我有一个基于Flask和LangChain的应用,本地构建Docker镜像并运行完全正常,但部署到Heroku时出现问题。操作步骤如下:

  • 执行heroku login登录Heroku平台;
  • 执行heroku container:login登录Heroku容器仓库;
  • 进入包含Dockerfile的Flask项目目录,执行heroku container:push web --app <app-name>。

执行第三步时持续收到405 Method Not Allowed错误,完整错误输出如下:

[+] Building 2.1s (12/12) FINISHED                                docker:desktop-linux
 => [internal] load build definition from Dockerfile                              0.0s
 => => transferring dockerfile: 226B                                              0.0s
 => resolve image config for docker-image://docker.io/docker/dockerfile:1         0.8s
 => CACHED docker-image://docker.io/docker/dockerfile:1@sha256:865e5dd094beca432  0.0s
 => => resolve docker.io/docker/dockerfile:1@sha256:865e5dd094beca432e8c0a1d5e1c  0.0s
 => [internal] load metadata for docker.io/library/python:3.12-slim               0.8s
 => [internal] load .dockerignore                                                 0.0s
 => => transferring context: 2B                                                   0.0s
 => [1/5] FROM docker.io/library/python:3.12-slim@sha256:af4e85f1cac90dd3771e472  0.0s
 => => resolve docker.io/library/python:3.12-slim@sha256:af4e85f1cac90dd3771e472  0.0s
 => [internal] load build context                                                 0.0s
 => => transferring context: 93B                                                  0.0s
 => CACHED [2/5] WORKDIR /test                                                    0.0s
 => CACHED [3/5] COPY requirements.txt requirements.txt                           0.0s
 => CACHED [4/5] RUN pip install -r requirements.txt                              0.0s
 => CACHED [5/5] COPY . .                                                         0.0s
 => exporting to image                                                            0.1s
 => => exporting layers                                                           0.0s
 => => exporting manifest sha256:8e61290c43414b6925441272dc06f4f0a4f23b5c5de7755  0.0s
 => => exporting config sha256:0931ca17cf70351a4cef92bbdfac6230b22c455c17544e2ac  0.0s
 => => exporting attestation manifest sha256:44105731c3395578fbc710ba7d7828abd44  0.0s
 => => exporting manifest list sha256:5bd92a0f9fc31324aab464d82285036b61a2132a53  0.0s
 => => naming to registry.heroku.com/indic-power/web:latest                       0.0s
 => => unpacking to registry.heroku.com/indic-power/web:latest                    0.0s
=== Pushing web (C:\Users\Photogauge\Desktop\rahul\docker\test\Dockerfile)

Using default tag: latest
The push refers to repository [registry.heroku.com/indic-power/web]
b91db956ff46: Pushed
6b08635bc459: Layer already exists
23acc3c7fc2a: Pushed
c8daa4e2ec2f: Pushed
8341816e3d13: Layer already exists
302e3ee49805: Layer already exists
38732fc0313c: Pushed
0bc61d7a3c35: Pushed
18bb7c8edce2: Layer already exists
failed commit on ref "manifest-sha256:8e61290c43414b6925441272dc06f4f0a4f23b5c5de775529a798ccda90ce0d2": unexpected status from PUT request to https://registry.heroku.com/v2/indic-power/web/manifests/latest: 405 Method Not Allowed
 »   Error: docker push exited with Error: 1

当前配置文件

Dockerfile

#syntax=docker/dockerfile:1
FROM python:3.12-slim

WORKDIR /power

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY data/ data/

COPY . .

CMD [ "python", "api.py"]

docker-compose.yaml

version: '2'
services:
  web:
    build: .
    ports: 
      - "5000:5000"
    volumes:
      - .:/app
    working_dir: /app
    command: python api.py
    env_file:
      - .env

已尝试执行docker builder prune和docker system prune -a清理Docker缓存,但问题仍未解决。


解决方法

1. 强制指定单架构构建推送

Heroku容器运行环境为amd64,若本地构建生成了多架构镜像(如同时支持arm64和amd64),会触发注册表的405限制。修改推送命令,指定架构:

heroku container:push web --app <app-name> --platform linux/amd64

也可以在Dockerfile中直接指定架构,确保只构建单平台镜像:

#syntax=docker/dockerfile:1
FROM --platform=linux/amd64 python:3.12-slim

2. 清理本地残留镜像并重新推送

即使执行了缓存清理,可能仍有残留的多架构manifest,先删除本地关联镜像再重新推送:

docker rmi registry.heroku.com/<app-name>/web:latest
heroku container:push web --app <app-name> --platform linux/amd64

3. 确认应用已启用容器部署

确保Heroku应用已切换到容器栈:

heroku stack:set container --app <app-name>

执行完成后再次推送镜像。

4. 统一Dockerfile与docker-compose的工作目录

虽然此问题不直接导致405,但统一路径可避免潜在问题:将Dockerfile中的WORKDIR /power修改为WORKDIR /app,与docker-compose配置保持一致。


内容的提问来源于stack exchange,提问作者Saad Sahir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:05:58