Flask Dockerfile generator
Generate a production Dockerfile for a Flask app served by Gunicorn, with dependencies resolved in a separate stage and a non-root runtime.
Configure
Loading...
What this Dockerfile does
Nothing flagged
Good practice: Multi-stage build (3 stages)
Compilers, dev dependencies and source files stay in the build stages. Only the runtime artefacts are copied into the final image.
Good practice: Runs as app, not root
A container escape from a root process is a host root process. Dropping privileges is the cheapest hardening step there is.
Good practice: .dockerignore keeps secrets out of the build context
`.git`, `.env` and local dependency folders never reach the daemon, so they cannot end up in a layer or in `docker history`.
Good practice: Dependency cache persists across builds
BuildKit cache mounts keep the package manager store outside the image. Rebuilds after a lockfile change reuse everything already downloaded, and the cache adds nothing to the final size.
Good practice: Healthcheck defined
Docker, Compose and Easypanel can tell the difference between a running process and a working app, and restart it when it wedges.
Good practice: Prebuilt wheels install directly
The Debian base matches the manylinux ABI, so packages with C extensions install as prebuilt wheels instead of compiling.
Good practice: uv resolves from a lockfile
`uv sync --frozen` fails if uv.lock does not match pyproject.toml, so a build can never silently drift from the versions you tested.
Good practice: Virtualenv copied, toolchain left behind
The compilers and dev headers live in the deps stage. The runtime image gets the resolved virtualenv and nothing else.
Good practice: Runs under Gunicorn, not `flask run`
Werkzeug's development server is single-threaded and explicitly not built for production traffic. Gunicorn is the standard WSGI server for this.
Note: Requires BuildKit
BuildKit is the default builder in Docker 23 and later. On anything older, export `DOCKER_BUILDKIT=1` before building.
Note: Estimated image size: ~130–220 MB
A rough band for the final stage, before your own dependencies. Run `docker images` after a build for the real number.
How to use it
Everything runs locally. Nothing is uploaded, and no account is needed.
Drop the files into your project root
Every generated file belongs next to your package manifest — the Dockerfile references paths relative to the build context, so nesting them in a subfolder breaks the COPY lines.
Build the image
docker build -t flask .Run it
docker run --rm -p 8000:8000 flaskOr bring up the whole stack
docker compose up --build