sudo docker build -t includeamin/basefastapi:latest .
Created
November 27, 2020 12:36
-
-
Save includeamin/0d3e86b90f09cadf034e982e26f957dc to your computer and use it in GitHub Desktop.
fastapi Dockerfile
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
FROM python:3.8 | |
LABEL maintainer="Sebastian Ramirez <[email protected]>" | |
RUN pip install --no-cache-dir uvicorn gunicorn | |
RUN pip install --no-cache-dir uvloop httptools websockets | |
COPY start.sh /start.sh | |
RUN chmod +x /start.sh | |
COPY gunicorn_conf.py /gunicorn_conf.py | |
COPY . /app | |
WORKDIR /app/ | |
ENV PYTHONPATH=/app | |
ENV PORT=3000 | |
ENV PORT2=3001 | |
ENV DEFAULT_MODULE_NAME=app.py | |
EXPOSE 3000 | |
EXPOSE 3001 | |
CMD ["/start.sh"] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import json | |
import multiprocessing | |
import os | |
workers_per_core_str = os.getenv("WORKERS_PER_CORE", "1") | |
max_workers_str = os.getenv("MAX_WORKERS") | |
use_max_workers = None | |
if max_workers_str: | |
use_max_workers = int(max_workers_str) | |
web_concurrency_str = os.getenv("WEB_CONCURRENCY", None) | |
host = os.getenv("HOST", "0.0.0.0") | |
port = os.getenv("PORT", "3000") | |
port2 = os.getenv("PORT2", "3001") | |
bind_env = os.getenv("BIND", None) | |
use_loglevel = os.getenv("LOG_LEVEL", "info") | |
if bind_env: | |
use_bind = bind_env | |
else: | |
use_bind = f"{host}:{port}" | |
use_bind2 = f"{host}:{port2}" | |
cores = multiprocessing.cpu_count() | |
workers_per_core = float(workers_per_core_str) | |
default_web_concurrency = workers_per_core * cores | |
if web_concurrency_str: | |
web_concurrency = int(web_concurrency_str) | |
assert web_concurrency > 0 | |
else: | |
web_concurrency = max(int(default_web_concurrency), 2) | |
if use_max_workers: | |
web_concurrency = min(web_concurrency, use_max_workers) | |
accesslog_var = os.getenv("ACCESS_LOG", "-") | |
use_accesslog = accesslog_var or None | |
errorlog_var = os.getenv("ERROR_LOG", "-") | |
use_errorlog = errorlog_var or None | |
graceful_timeout_str = os.getenv("GRACEFUL_TIMEOUT", "120") | |
timeout_str = os.getenv("TIMEOUT", "120") | |
keepalive_str = os.getenv("KEEP_ALIVE", "5") | |
# Gunicorn config variables | |
loglevel = use_loglevel | |
workers = web_concurrency | |
bind = [use_bind, use_bind2] | |
errorlog = use_errorlog | |
worker_tmp_dir = "/dev/shm" | |
accesslog = use_accesslog | |
graceful_timeout = int(graceful_timeout_str) | |
timeout = int(timeout_str) | |
keepalive = int(keepalive_str) | |
# For debugging and testing | |
log_data = { | |
"loglevel": loglevel, | |
"workers": workers, | |
"bind": bind, | |
"graceful_timeout": graceful_timeout, | |
"timeout": timeout, | |
"keepalive": keepalive, | |
"errorlog": errorlog, | |
"accesslog": accesslog, | |
# Additional, non-gunicorn variables | |
"workers_per_core": workers_per_core, | |
"use_max_workers": use_max_workers, | |
"host": host, | |
"port": port, | |
} | |
print(json.dumps(log_data)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/env sh | |
echo "Running inside /app/prestart.sh, you could add migrations to this file, e.g.:" | |
echo " | |
#! /usr/bin/env bash | |
# Let the DB start | |
sleep 10; | |
# Run migrations | |
alembic upgrade head | |
" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/env sh | |
set -e | |
if [ -f /app/app/app.py ]; then | |
DEFAULT_MODULE_NAME=app.app | |
elif [ -f /app/app.py ]; then | |
DEFAULT_MODULE_NAME=app | |
fi | |
MODULE_NAME=${MODULE_NAME:-$DEFAULT_MODULE_NAME} | |
VARIABLE_NAME=${VARIABLE_NAME:-app} | |
export APP_MODULE=${APP_MODULE:-"$MODULE_NAME:$VARIABLE_NAME"} | |
if [ -f /app/gunicorn_conf.py ]; then | |
DEFAULT_GUNICORN_CONF=/app/gunicorn_conf.py | |
elif [ -f /app/app/gunicorn_conf.py ]; then | |
DEFAULT_GUNICORN_CONF=/app/app/gunicorn_conf.py | |
else | |
DEFAULT_GUNICORN_CONF=/gunicorn_conf.py | |
fi | |
export GUNICORN_CONF=${GUNICORN_CONF:-$DEFAULT_GUNICORN_CONF} | |
export WORKER_CLASS=${WORKER_CLASS:-"uvicorn.workers.UvicornWorker"} | |
# If there's a prestart.sh script in the /app directory or other path specified, run it before starting | |
PRE_START_PATH=${PRE_START_PATH:-/app/prestart.sh} | |
echo "Checking for script in $PRE_START_PATH" | |
if [ -f $PRE_START_PATH ] ; then | |
echo "Running script $PRE_START_PATH" | |
. "$PRE_START_PATH" | |
else | |
echo "There is no script $PRE_START_PATH" | |
fi | |
# Start Gunicorn | |
exec gunicorn -k "$WORKER_CLASS" -c "$GUNICORN_CONF" "$APP_MODULE" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment