Docker images¶
Pull images¶
Docker images are stored in GitHub Container Registry (GHCR), which is a Docker registry like Docker Hub. Public Docker images can be pulled anonymously from ghcr.io.
Simply running docker pull ghcr.io/br3ndonland/inboard will pull the latest FastAPI image (Docker uses the latest tag by default). If specific versions of inboard or Python are desired, append the version numbers to the specified Docker tags as shown below (new in inboard version 0.6.0).
# Pull latest FastAPI image
docker pull ghcr.io/br3ndonland/inboard
# Pull latest version of each image
docker pull ghcr.io/br3ndonland/inboard:base
docker pull ghcr.io/br3ndonland/inboard:fastapi
docker pull ghcr.io/br3ndonland/inboard:starlette
# Pull image from specific release
docker pull ghcr.io/br3ndonland/inboard:base-0.6.0
docker pull ghcr.io/br3ndonland/inboard:fastapi-0.6.0
docker pull ghcr.io/br3ndonland/inboard:starlette-0.6.0
# Pull image with specific Python version
docker pull ghcr.io/br3ndonland/inboard:base-python3.8
docker pull ghcr.io/br3ndonland/inboard:fastapi-python3.8
docker pull ghcr.io/br3ndonland/inboard:starlette-python3.8
# Pull image from specific release and with specific Python version
docker pull ghcr.io/br3ndonland/inboard:base-0.6.0-python3.8
docker pull ghcr.io/br3ndonland/inboard:fastapi-0.6.0-python3.8
docker pull ghcr.io/br3ndonland/inboard:starlette-0.6.0-python3.8
Use images in a Dockerfile¶
For a Poetry project with the following directory structure:
repo/package/main.pyprestart.py
Dockerfilepoetry.lockpyproject.toml
The Dockerfile could look like this:
Example Dockerfile for Poetry project
FROM ghcr.io/br3ndonland/inboard:fastapi
# Install Python requirements
COPY poetry.lock pyproject.toml /app/
WORKDIR /app/
RUN poetry install --no-dev --no-interaction --no-root
# Install Python app
COPY package /app/package
ENV APP_MODULE=package.main:app
# RUN command already included in base image
Organizing the Dockerfile this way helps leverage the Docker build cache. Files and commands that change most frequently are added last to the Dockerfile. Next time the image is built, Docker will skip any layers that didn't change, speeding up builds.
For a standard pip install:
repo/package/main.pyprestart.py
Dockerfilerequirements.txt
Example Dockerfile for project with pip and requirements.txt
FROM ghcr.io/br3ndonland/inboard:fastapi
# Install Python requirements
COPY requirements.txt /app/
WORKDIR /app/
RUN python -m pip install -r requirements.txt
# Install Python app
COPY package /app/package
ENV APP_MODULE=package.main:app
# RUN command already included in base image
The image could then be built with:
cd /path/to/repo
docker build . -t imagename:latest
The final argument is the Docker image name (imagename in this example). Replace with your image name.
Run containers¶
Run container:
docker run -d -p 80:80 imagename
Run container with mounted volume and Uvicorn reloading for development:
cd /path/to/repo
docker run -d -p 80:80 \
-e "LOG_LEVEL=debug" -e "PROCESS_MANAGER=uvicorn" -e "WITH_RELOAD=true" \
-v $(pwd)/package:/app/package imagename
Details on the docker run command:
-e "PROCESS_MANAGER=uvicorn" -e "WITH_RELOAD=true"will instructstart.pyto run Uvicorn with reloading and without Gunicorn. The Gunicorn configuration won't apply, but these environment variables will still work as described:APP_MODULEHOSTPORTLOG_COLORSLOG_FORMATLOG_LEVELRELOAD_DIRSWITH_RELOAD
-v $(pwd)/package:/app/package: the specified directory (/path/to/repo/packagein this example) will be mounted as a volume inside of the container at/app/package. When files in the working directory change, Docker and Uvicorn will sync the files to the running Docker container.