'Docker-compose FastAPI --reload

I have FastAPI app running in docker docker container. It works well except only one thing

The app doesn't reload if any changes. The changes applied only if i restart the container. But i wonder why it doesn't reload app if i put in command --reload flag?

I understand that docker itself do not reload if some changes in code. But app must be if flag --reload in command .

If I misunderstand, please advise how to achieve what i want. Thanks

main.py

from typing import Optional

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}


if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)

docker-compose.yml

version: "3"

services:

  web:
    build: .
    restart: always
    command: bash -c "uvicorn main:app --host 0.0.0.0 --port 8000 --reload"
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

  db:
    image: postgres
    ports:
      - "50009:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=test_db


Solution 1:[1]

this works for me

version: "3.9"

services:
  people:
    container_name: people
    build: .
    working_dir: /code/app
    command: uvicorn main:app --host 0.0.0.0 --reload
    environment:
      DEBUG: 1
    volumes:
      - ./app:/code/app
    ports:
      - 8008:8000
    restart: on-failure

this is my directory structure

.
??? Dockerfile
??? Makefile
??? app
?   ??? main.py
??? docker-compose.yml
??? requirements.txt

make sure working_dir and volumes section's - ./app:/code/app match

example run:

docker-compose up --build

...
Attaching to people
people    | INFO:     Will watch for changes in these directories: ['/code/app']

Solution 2:[2]

Are you starting the container with docker compose up? This is working for me with hot reload at http://127.0.0.1.

version: "3.9"

services:
  bff:
    container_name: bff
    build: .
    working_dir: /code/app
    command: uvicorn main:app --host 0.0.0.0 --port 8000 --reload
    environment:
      DEBUG: 1
    volumes:
      - .:/code
    ports:
      - "80:8000"
    restart: on-failure

Also, I don't have your final two lines, if __name__ == etc., in my app. Not sure if that would change anything.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Kushagra Verma
Solution 2 Lucas