docker compose dev env setup
parent
07d716749e
commit
6b432a750e
@ -0,0 +1,43 @@
|
||||
FROM python:3.10-slim-buster
|
||||
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
ENV PYTHONDONTWRITEBYTECODE 1
|
||||
|
||||
RUN apt-get update \
|
||||
# dependencies for building Python packages
|
||||
&& apt-get install -y build-essential \
|
||||
# psycopg2 dependencies
|
||||
&& apt-get install -y libpq-dev \
|
||||
# Additional dependencies
|
||||
&& apt-get install -y telnet netcat \
|
||||
# cleaning up unused files
|
||||
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Requirements are installed here to ensure they will be cached.
|
||||
COPY ./requirements.txt /requirements.txt
|
||||
RUN pip install -r /requirements.txt
|
||||
|
||||
COPY ./compose/local/fastapi/entrypoint /entrypoint
|
||||
RUN sed -i 's/\r$//g' /entrypoint
|
||||
RUN chmod +x /entrypoint
|
||||
|
||||
COPY ./compose/local/fastapi/start /start-web
|
||||
RUN sed -i 's/\r$//g' /start-web
|
||||
RUN chmod +x /start
|
||||
|
||||
COPY ./compose/local/fastapi/celery/worker/start /start-celeryworker
|
||||
RUN sed -i 's/\r$//g' /start-celeryworker
|
||||
RUN chmod +x /start-celeryworker
|
||||
|
||||
COPY ./compose/local/fastapi/celery/beat/start /start-celerybeat
|
||||
RUN sed -i 's/\r$//g' /start-celerybeat
|
||||
RUN chmod +x /start-celerybeat
|
||||
|
||||
COPY ./compose/local/fastapi/celery/flower/start /start-flower
|
||||
RUN sed -i 's/\r$//g' /start-flower
|
||||
RUN chmod +x /start-flower
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
ENTRYPOINT ["/entrypoint"]
|
@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -o errexit
|
||||
set -o nounset
|
||||
|
||||
rm -f './celerybeat.pid'
|
||||
celery -A main.celery beat -l info
|
@ -0,0 +1,18 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -o errexit
|
||||
set -o nounset
|
||||
|
||||
worker_ready() {
|
||||
celery -A main.celery inspect ping
|
||||
}
|
||||
|
||||
until worker_ready; do
|
||||
>&2 echo 'Celery workers not available'
|
||||
sleep 1
|
||||
done
|
||||
>&2 echo 'Celery workers is available'
|
||||
|
||||
celery flower \
|
||||
--app=main.celery \
|
||||
--broker="${CELERY_BROKER_URL}"
|
@ -0,0 +1,45 @@
|
||||
#!/bin/bash
|
||||
|
||||
# if any of the commands in your code fails for any reason, the entire script fails
|
||||
set -o errexit
|
||||
# fail exit if one of your pipe command fails
|
||||
set -o pipefail
|
||||
# exits if any of your variables is not set
|
||||
set -o nounset
|
||||
|
||||
postgres_ready() {
|
||||
python << END
|
||||
import sys
|
||||
|
||||
import psycopg2
|
||||
import urllib.parse as urlparse
|
||||
import os
|
||||
|
||||
url = urlparse.urlparse(os.environ['DATABASE_URL'])
|
||||
dbname = url.path[1:]
|
||||
user = url.username
|
||||
password = url.password
|
||||
host = url.hostname
|
||||
port = url.port
|
||||
|
||||
try:
|
||||
psycopg2.connect(
|
||||
dbname=dbname,
|
||||
user=user,
|
||||
password=password,
|
||||
host=host,
|
||||
port=port
|
||||
)
|
||||
except psycopg2.OperationalError:
|
||||
sys.exit(-1)
|
||||
sys.exit(0)
|
||||
|
||||
END
|
||||
}
|
||||
until postgres_ready; do
|
||||
>&2 echo 'Waiting for PostgreSQL to become available...'
|
||||
sleep 1
|
||||
done
|
||||
>&2 echo 'PostgreSQL is available'
|
||||
|
||||
exec "$@"
|
@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -o errexit
|
||||
set -o pipefail
|
||||
set -o nounset
|
||||
|
||||
alembic upgrade head
|
||||
# Reload because this is a dev setup
|
||||
uvicorn main:app --reload --reload-dir project --host 0.0.0.0
|
@ -0,0 +1,80 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
web:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./compose/local/fastapi/Dockerfile
|
||||
image: fastapi_celery_example_web
|
||||
# '/start' is the shell script used to run the service
|
||||
command: /start
|
||||
# this volume is used to map the files and folders on the host to the container
|
||||
# so if we change code on the host, code in the docker container will also be changed
|
||||
volumes:
|
||||
- .:/app
|
||||
ports:
|
||||
- 8010:8000
|
||||
env_file:
|
||||
- .env/.dev-sample
|
||||
depends_on:
|
||||
- redis
|
||||
- db
|
||||
|
||||
db:
|
||||
image: postgres:14-alpine
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data/
|
||||
environment:
|
||||
- POSTGRES_DB=fastapi_celery
|
||||
- POSTGRES_USER=fastapi_celery
|
||||
- POSTGRES_PASSWORD=fastapi_celery
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
|
||||
celery_worker:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./compose/local/fastapi/Dockerfile
|
||||
image: fastapi_celery_example_celery_worker
|
||||
command: /start-celeryworker
|
||||
volumes:
|
||||
- .:/app
|
||||
env_file:
|
||||
- .env/.dev-sample
|
||||
depends_on:
|
||||
- redis
|
||||
- db
|
||||
|
||||
celery_beat:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./compose/local/fastapi/Dockerfile
|
||||
image: fastapi_celery_example_celery_beat
|
||||
command: /start-celerybeat
|
||||
volumes:
|
||||
- .:/app
|
||||
env_file:
|
||||
- .env/.dev-sample
|
||||
depends_on:
|
||||
- redis
|
||||
- db
|
||||
|
||||
flower:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./compose/local/fastapi/Dockerfile
|
||||
image: fastapi_celery_example_celery_flower
|
||||
command: /start-flower
|
||||
volumes:
|
||||
- .:/app
|
||||
env_file:
|
||||
- .env/.dev-sample
|
||||
ports:
|
||||
- 5557:5555
|
||||
depends_on:
|
||||
- redis
|
||||
- db
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
Loading…
Reference in New Issue