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
相关产品推荐
相关产品推荐

