Docker Compose
Configuration File
docker-compose.yml
version: "3"
services:
  api:
    image: tallguyjneks/<hub-repo-name>:<optional-tag-name> # instead of build if this was a production env
    build: . # where is the thing im building
    depends_on: # builds dependencies before main containers
      - postgres
    ports:
      - 8000:8000 # <port on localhost>:<port on container
    volumes:
      - ./app:/usr/src/app:ro # makes it so docker can be aware of changes between a linked directory and `ro` means read only so docker cant change the files
    command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload # overrides default command for the image when ran
    env_file:
      - ./.env
    # ^^^ OR vvv
    environment:
      - DATABASE_HOSTNAME=postgres # docker compose uses its own network dns so you can specify a name of another container instead of the ip address
      - DATABASE_PORT=5432 # you can either list them out or point docker to a .env file
  postgres:
    image: postgres
    environment:
      - POSTGRES_PASSWORD=password123
      - POSTGRES_DB=fastapi
    volumes: # data is transient in the image so you need to have a place to have permanently stored data
      - postgre-db: /var/lib/postgresql/data
volumes:
  postgres-db:
Tips
- having 2 files for a dev and a prod environment
 - no using 
--reloadin production code because the code shouldn't be changing - port 80 on local host so that you can view in web browser
 - on linux the 
environment:values can use linux variable accessors${DATABASE_HOSTNAME} 
Children