Dockerfile for Python (django) application
This is the base Dockerfile can be used to serve Django or similar php application. Based on Debian slim. Average size may vary.
Backend.Dockerfile
FROM python:3.7-slim-stretch
RUN apt-get update \
&& apt-get -y install libpq-dev build-essential \
&& apt-get -y install nginx \
&& export LC_ALL="en_EN.UTF-8" \
&& mkdir /opt/app \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
WORKDIR /opt/app
COPY requirements.txt /opt/app/requirements.txt
RUN pip3 install -r /opt/app/requirements.txt
COPY config/nginx_proxy.conf /etc/nginx/sites-available/default
EXPOSE 80
COPY . /opt/app
CMD /bin/bash -c "while true; do sleep 1; done"
Frontend.Dockerfile
FROM node:12-alpine
RUN apk add nginx curl
RUN mkdir -p /run/nginx && mkdir -p /app/packages/ui
COPY ./nginx_default.conf /etc/nginx/conf.d/default.conf
WORKDIR /app
ENV API_URL=https://hypr.shakuro.info
COPY . .
RUN yarn install
RUN yarn build
RUN ln -s /app/packages/app-next/.next/ /app/packages/app-next/_next
EXPOSE 80
CMD ["sh", "-c", "nginx; yarn start"]
Docker-compose.file
version: '3'
services:
db:
image: postgres:12-alpine
container_name: ${PROJECT_NAME}_db
restart: always
networks:
overlay:
aliases:
- postgres
ports:
- "5432:5432"
env_file:
- ./.env
volumes:
- pg_data:/var/lib/postgresql/data
backend:
build:
context: .
dockerfile: Dockerfile
image: ${PROJECT_HUB}/${PROJECT_NAME}/backend:${IMAGE_TAG}
container_name: ${PROJECT_NAME}_backend
restart: always
#volumes:
# - ./:/opt/app
networks:
overlay:
aliases:
- backend
env_file:
- ./.env
command: bash -c "nginx && python3 manage.py migrate && gunicorn --workers 3 --bind unix:/tmp/gunicorn.sock config.wsgi:application"
#command: bash -c "python manage.py runserver 0:8000"
ports:
- "8000:80"
frontend:
image: ${PROJECT_HUB}/${PROJECT_NAME}/frontend:${IMAGE_TAG}
container_name: ${PROJECT_NAME}_frontend
restart: always
networks:
overlay:
aliases:
- frontend
env_file:
- ./.env
ports:
- "7000:80"
networks:
overlay:
volumes:
pg_data:
nginx_proxy.conf (for backend)
upstream app_server {
server unix:/tmp/gunicorn.sock fail_timeout=0;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
root /opt/app;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri @proxy_to_app;
}
location /static/ {
root /opt/app;
}
location @proxy_to_app {
proxy_pass http://app_server;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Request-Start $msec;
}
}
nginx_default.conf (for frontend)
upstream hypr {
server 127.0.0.1:3001;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
#gzip on;
#gzip_vary on;
#gzip_types text/plain application/json application/javascript image/svg+xml;
#location /static {
# root /app/packages/project-bfd;
# expires max;
#}
location /_next {
root /app/packages/app-next;
expires max;
}
location / {
proxy_pass http://hypr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}