2

Either I'm doing something wrong or Heroku is messing up. Heroku supports targeting a particular stage in a Dockerfile. I have a multistage Dockerfile but Heroku is not respecting the build.docker.release.target in my heroku.yml. For what it's worth, targeting works fine with docker-compose.yml.

I'm trying to keep dev and prod in the same Dockerfile. Essentially dev and prod are forked from base. I could flesh it out more, but the stages are:

FROM python:3.10.0-slim-buster AS venv

...


FROM python:3.10.0-slim-buster as base

...


FROM base AS dev

...

ENTRYPOINT ["entrypoint.dev.sh"]



FROM base AS prod

...

ENTRYPOINT ["entrypoint.prod.sh"]

My heroku.yml specifically targets the prod stage:

setup:
    addons:
        - plan: heroku-postgresql
          as: DATABASE
build:
    docker:
        release:
            dockerfile: image/app/Dockerfile
            target: prod
        web: image/app/Dockerfile
    config:
        DJANGO_ENV: production
release:
    image: web
    command:
        - ./deployment-tasks.sh
run:
    web: gunicorn server.wsgi:application --bind 0.0.0.0:$PORT --log-level debug --access-logfile - --error-logfile -

However, Heroku builds all the stages, seems like it just runs down the Dockerfile till the end. The Heroku build logs show that first dev follows base

dev follows base

and then prod follows dev

prod follows dev

I would expect it to jump from base to prod, skipping dev.

Is this an issue on my side or Heroku's?

Jaime Salazar
  • 349
  • 1
  • 2
  • 11

1 Answers1

2

I haven't tested this with heroku.yml because I've moved to GitHub Actions but I believe the error was having prod come after dev. Apparently the --target flag in docker build means it will stop at that stage, so it will run everything before it.

Jaime Salazar
  • 349
  • 1
  • 2
  • 11