From e6852d6c773bd8f062b9707f82e2cbc705453038 Mon Sep 17 00:00:00 2001
From: rlacko <rlacko@sch.bme.hu>
Date: Tue, 4 Feb 2020 21:06:27 +0100
Subject: [PATCH] production Dockerfile and script

---
 Dockerfile                           |  2 +-
 Dockerfile.prod                      | 69 ++++++++++++++++++++++++++++
 src/entrypoint.prod.sh               | 14 ++++++
 src/entrypoint.sh                    |  2 +-
 src/kszkepzes/settings/production.py |  2 +-
 src/manage.py                        |  2 +-
 6 files changed, 87 insertions(+), 4 deletions(-)
 create mode 100644 Dockerfile.prod
 create mode 100755 src/entrypoint.prod.sh

diff --git a/Dockerfile b/Dockerfile
index e1e843b..0dd2d90 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
 # pull official base image
-FROM python:3.8.0
+FROM python:3.8.1
 
 # set work directory
 WORKDIR /usr/src/app
diff --git a/Dockerfile.prod b/Dockerfile.prod
new file mode 100644
index 0000000..ef6ac28
--- /dev/null
+++ b/Dockerfile.prod
@@ -0,0 +1,69 @@
+###########
+# BUILDER #
+###########
+
+# pull official base image
+FROM python:3.8.1 as builder
+
+# set work directory
+WORKDIR /usr/src/app
+
+# set environment variables
+ENV PYTHONDONTWRITEBYTECODE 1
+ENV PYTHONUNBUFFERED 1
+
+# install dependencies
+RUN apt-get -y update
+RUN apt-get install -y python python-pip python-dev python-django-extensions postgresql-client netcat
+RUN apt-get -y update && apt-get -y autoremove
+
+# lint
+RUN pip install --upgrade pip
+RUN pip install flake8
+COPY ./src /usr/src/app/
+#RUN flake8 --max-line-length=125 --exclude=kszkepzes,migrations .
+
+# install dependencies
+COPY ./requirements/production.txt /usr/src/app/requirements.txt
+RUN pip wheel --no-cache-dir --no-deps --wheel-dir /usr/src/app/wheels -r requirements.txt
+
+#########
+# FINAL #
+#########
+
+# pull official base image
+FROM python:3.8.1
+
+# create directory for the app user
+RUN mkdir -p /home/app
+
+# create the app user
+RUN groupadd app && useradd -g app app
+
+# create the appropriate directories
+ENV HOME=/home/app
+ENV APP_HOME=/home/app/kszkepzes-backend
+RUN mkdir $APP_HOME
+WORKDIR $APP_HOME
+
+# install dependencies
+RUN apt-get -y update && apt-get install netcat -y
+COPY --from=builder /usr/src/app/wheels /wheels
+COPY --from=builder /usr/src/app/requirements.txt .
+RUN pip install --upgrade pip
+RUN pip install --no-cache /wheels/*
+
+# copy entrypoint-prod.sh
+COPY ./src/entrypoint.prod.sh $APP_HOME
+
+# copy project
+COPY ./src $APP_HOME
+
+# chown all the files to the app user
+RUN chown -R app:app $APP_HOME
+
+# change to the app user
+USER app
+
+# run entrypoint.sh
+ENTRYPOINT ["/home/app/kszkepzes-backend/entrypoint.prod.sh"]
\ No newline at end of file
diff --git a/src/entrypoint.prod.sh b/src/entrypoint.prod.sh
new file mode 100755
index 0000000..5236bfa
--- /dev/null
+++ b/src/entrypoint.prod.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+if [ "$DJANGO_SETTINGS_MODULE" = "kszkepzes.settings.production" ]
+then
+    echo "Waiting for postgres..."
+
+    while ! nc -z $DB_HOST $DB_PORT; do
+      sleep 0.1
+    done
+
+    echo "PostgreSQL started"
+fi
+
+exec "$@"
\ No newline at end of file
diff --git a/src/entrypoint.sh b/src/entrypoint.sh
index 08fe051..84c4515 100755
--- a/src/entrypoint.sh
+++ b/src/entrypoint.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-if [ "$DATABASE" = "postgres" ]
+if [ "$DJANGO_SETTINGS_MODULE" = "kszkepzes.settings.production" ]
 then
     echo "Waiting for postgres..."
 
diff --git a/src/kszkepzes/settings/production.py b/src/kszkepzes/settings/production.py
index 7c121b5..785c982 100644
--- a/src/kszkepzes/settings/production.py
+++ b/src/kszkepzes/settings/production.py
@@ -6,7 +6,7 @@ ALLOWED_HOSTS = ['*']
 
 DATABASES = {
     'default': {
-        'ENGINE': 'django.db.backends.postgresql',
+        'ENGINE': os.getenv('DB_ENGINE', 'django.db.backends.postgresql'),
         'NAME': os.getenv('DB_NAME', 'kszkepzes'),
         'USER': os.getenv('DB_USER'),
         'PASSWORD': os.getenv('DB_PASSWORD'),
diff --git a/src/manage.py b/src/manage.py
index 57605e1..e4402b7 100755
--- a/src/manage.py
+++ b/src/manage.py
@@ -3,7 +3,7 @@ import os
 import sys
 
 if __name__ == "__main__":
-    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "kszkepzes.settings.production")
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "kszkepzes.settings.local")
     try:
         from django.core.management import execute_from_command_line
     except ImportError:
-- 
GitLab