An example application with various configurations and setups to run Blitz with Docker.
The 'complete' Dockerfile
is one large file that contains all the environments. There are also Dockerfiles
available for specific environment if you only need those.
You can also mix and match the content of the Dockerfiles
to create a custom one. The image sizes are based on a fresh Blitz app (0.35.0) like the one used in this repo.
Sizes can vary depending on the Blitz version.
Type | Base image | Size |
---|---|---|
complete | node:14-stretch-slim | see below for each stage |
prod-only | node:14-stretch-slim | 797MB |
prod-only w/ BuildKit | node:14-stretch-slim | 612MB |
[dev-only] | node:14-stretch-slim | |
complete | node:14-alpine | See below for each stage |
prod-only | node:14-alpine | 1.06GB |
Place the Dockerfile
that you want to use at the root of your application and run:
docker build . -t "IMAGE_NAME:TAG" \
--build-arg DATABASE_URL="postgresql://user:password@host:port/db?sslmode=require&pgbouncer=true" \
--build-arg SESSION_SECRET_KEY="yoursupersecretsessionkey"
If are using one of the 'complete' Dockerfiles
and you want to stop at a specific stage you can do:
docker build . --target testing -t "IMAGE_NAME:TAG" \
--build-arg DATABASE_URL="postgresql://user:password@host:port/db?sslmode=require&pgbouncer=true"
--build-arg SESSION_SECRET_KEY="yoursupersecretsessionkey"
You can speed up the image build process and performance if you are using Docker v18.09 or later by using BuildKit. This is especially useful in combination with CI/CD. You can enable it by setting:
export DOCKER_BUILDKIT=1
Now you can build your image with one of the BuildKit Dockerfiles.
This is just a very basic way to build your image. You'll probably want to use CI/CD to automate this. An easy way to get started is this GitHub Action to build and push Docker images.
Place the docker-compose
config file with the database that you want to use at the root of your application.
Currently you can choose between PostgreSQL and MySQL.
- Production* with remote database (managed on DO, AWS, Heroku etc.)
- Production* with local database
* Docker Compose provides an easy way to deploy apps to production. This works fine for small and/or low-traffic apps on a single server.
If you need constant uptime, high-availability, load-balancing or anything like that you can check out some of the popular solutions. The easiest way to get started is by using Docker Swarm Mode (this is not Docker Classic Swarm which is deprecated). Other options are Kubernetes, which is offered as a managed service by most cloud providers, AWS ECS, Google Cloud Run or HashiCorp Nomad.
- Use official images
- Explicit image reference, avoid
latest
tag or generic aliases likenode
- Multistage builds
- Non-root
node
user - Reduce the number of layers by merging
RUN
,FROM
, andCMD
commands.
Using multipleCOPY
lines though to avoid that a change to a file invalidates the whole layer - No dev dependencies in production image
- Delete caches
- Use
.dockerignore
- Split long or complex RUN statements on multiple lines separated with backslashes to make the Dockerfile more readable,
understandable, and more maintainable.