如何将cookiecutter-django创建的多份Docker镜像推送至Heroku?
我之前帮别人处理过类似的cookiecutter-django部署到Heroku容器的问题,你遇到的No images to push报错,本质是Heroku默认在当前目录找Dockerfile,但cookiecutter-django把生产环境的Dockerfile放在了compose/production/django/子目录里,导致Heroku找不到正确的构建文件。下面是两种可行的解决方案,推荐第一种用heroku.yml的方式,更规范也方便后续维护:
方法一:使用heroku.yml配置文件(推荐)
这种方式让Heroku明确知道要构建哪个Dockerfile,以及如何运行服务:
- 在项目根目录创建
heroku.yml文件,填入以下内容:
build: docker: web: compose/production/django/Dockerfile run: web: /start
这里的web是Heroku的默认服务名称,compose/production/django/Dockerfile是cookiecutter-django生成的生产环境Django容器镜像文件,/start是该Dockerfile中定义的启动命令(对应cookiecutter-django的生产启动脚本)。
- 告诉Heroku使用容器栈运行你的应用:
heroku stack:set container
配置必要的环境变量(Heroku不会自动读取本地的.env文件):
- 设置DEBUG为False(生产环境必须关闭):
heroku config:set DEBUG=False - 设置SECRET_KEY(可以用本地.env里的,或者生成一个新的):
heroku config:set SECRET_KEY="your-secure-secret-key-here" - 设置ALLOWED_HOSTS为你的Heroku应用域名(格式为
your-app-name.herokuapp.com):heroku config:set ALLOWED_HOSTS="your-app-name.herokuapp.com" - 如果需要数据库,添加Heroku Postgres插件(会自动设置
DATABASE_URL环境变量):heroku addons:create heroku-postgresql:hobby-dev - 如果用到Redis(比如缓存、Celery),添加Heroku Redis插件:
heroku addons:create heroku-redis:hobby-dev
- 设置DEBUG为False(生产环境必须关闭):
构建并推送镜像到Heroku:
heroku container:push web
- 发布应用:
heroku container:release web
方法二:直接指定Dockerfile路径构建
如果不想用heroku.yml,可以在push时直接指定生产环境Dockerfile的路径:
- 先设置容器栈(和方法一一样):
heroku stack:set container
配置好所有必要的环境变量(参考方法一的步骤3)。
在项目根目录执行以下命令推送镜像:
heroku container:push web --file compose/production/django/Dockerfile
- 发布应用:
heroku container:release web
常见问题排查
- 确保你已经登录Heroku CLI:执行
heroku login确认登录状态。 - 检查Dockerfile中的路径是否正确:cookiecutter-django的生产Dockerfile是基于项目根目录作为构建上下文的,所以COPY指令的路径是正确的,不要在子目录里执行push命令。
- 如果部署后应用无法启动,查看日志:
heroku logs --tail来排查具体错误(比如环境变量缺失、依赖安装失败等)。
内容的提问来源于stack exchange,提问作者Jay Jung
相关产品推荐
相关产品推荐

