From c5ca26e7c1aff185d2952371824ffbacf9191cff Mon Sep 17 00:00:00 2001 From: Piero Toffanin Date: Sun, 11 Sep 2016 19:52:31 -0400 Subject: [PATCH] Added docker-compose support --- .gitignore | 3 + Dockerfile | 16 +++++ db/Dockerfile | 4 ++ db/init.sql | 2 + docker-compose.yml | 18 +++++ requirements.txt | 6 ++ start.sh | 11 ++++ wait-for-it.sh | 161 +++++++++++++++++++++++++++++++++++++++++++++ webodm/settings.py | 2 +- 9 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 Dockerfile create mode 100644 db/Dockerfile create mode 100644 db/init.sql create mode 100644 docker-compose.yml create mode 100644 requirements.txt create mode 100644 start.sh create mode 100644 wait-for-it.sh diff --git a/.gitignore b/.gitignore index 72364f99..8657be1e 100644 --- a/.gitignore +++ b/.gitignore @@ -87,3 +87,6 @@ ENV/ # Rope project settings .ropeproject + +# Initialization flag +.initialized \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..9cda3c98 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +FROM python:2.7 +MAINTAINER Piero Toffanin + +ENV PYTHONUNBUFFERED 1 +ENV PYTHONPATH $PYTHONPATH:/webodm + +# Prepare directory +RUN mkdir /webodm +WORKDIR /webodm + +# Install pip reqs +ADD requirements.txt /webodm/ +RUN pip install -r requirements.txt + +# Add repository files +ADD . /webodm/ diff --git a/db/Dockerfile b/db/Dockerfile new file mode 100644 index 00000000..f17fc19c --- /dev/null +++ b/db/Dockerfile @@ -0,0 +1,4 @@ +FROM postgres:9.5 +MAINTAINER Piero Toffanin +EXPOSE 5432 +COPY init.sql /docker-entrypoint-initdb.d/init-db.sql diff --git a/db/init.sql b/db/init.sql new file mode 100644 index 00000000..928f461e --- /dev/null +++ b/db/init.sql @@ -0,0 +1,2 @@ +ALTER USER postgres PASSWORD 'postgres'; +CREATE DATABASE webodm_dev; \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..5dcfc5b9 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,18 @@ +version: '2' +services: + db: + build: ./db + container_name: db + ports: + - "5432:5432" + webapp: + build: . + container_name: webapp + entrypoint: /bin/bash /webodm/wait-for-it.sh db:5432 -- /webodm/start.sh + volumes: + - .:/webodm + ports: + - "8000:8000" + depends_on: + - db + restart: on-failure:10 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..890a489a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +Django==1.10 +anyjson==0.3.3 +pillow==3.3.1 +psycopg2==2.6.2 +pytz==2016.6.1 +wsgiref==0.1.2 diff --git a/start.sh b/start.sh new file mode 100644 index 00000000..bde1b762 --- /dev/null +++ b/start.sh @@ -0,0 +1,11 @@ +#!/bin/bash +if ! [ -a .initialized ]; then + echo First run, migrating... + python manage.py migrate + + echo Creating default superuser... + echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'admin')" | python manage.py shell + touch .initialized +fi + +python manage.py runserver 0.0.0.0:8000 \ No newline at end of file diff --git a/wait-for-it.sh b/wait-for-it.sh new file mode 100644 index 00000000..2af99e08 --- /dev/null +++ b/wait-for-it.sh @@ -0,0 +1,161 @@ +#!/usr/bin/env bash +# Use this script to test if a given TCP host/port are available + +cmdname=$(basename $0) + +echoerr() { if [[ $QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } + +usage() +{ + cat << USAGE >&2 +Usage: + $cmdname host:port [-s] [-t timeout] [-- command args] + -h HOST | --host=HOST Host or IP under test + -p PORT | --port=PORT TCP port under test + Alternatively, you specify the host and port as host:port + -s | --strict Only execute subcommand if the test succeeds + -q | --quiet Don't output any status messages + -t TIMEOUT | --timeout=TIMEOUT + Timeout in seconds, zero for no timeout + -- COMMAND ARGS Execute command with args after the test finishes +USAGE + exit 1 +} + +wait_for() +{ + if [[ $TIMEOUT -gt 0 ]]; then + echoerr "$cmdname: waiting $TIMEOUT seconds for $HOST:$PORT" + else + echoerr "$cmdname: waiting for $HOST:$PORT without a timeout" + fi + start_ts=$(date +%s) + while : + do + (echo > /dev/tcp/$HOST/$PORT) >/dev/null 2>&1 + result=$? + if [[ $result -eq 0 ]]; then + end_ts=$(date +%s) + echoerr "$cmdname: $HOST:$PORT is available after $((end_ts - start_ts)) seconds" + break + fi + sleep 1 + done + return $result +} + +wait_for_wrapper() +{ + # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 + if [[ $QUIET -eq 1 ]]; then + timeout $TIMEOUT $0 --quiet --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & + else + timeout $TIMEOUT $0 --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & + fi + PID=$! + trap "kill -INT -$PID" INT + wait $PID + RESULT=$? + if [[ $RESULT -ne 0 ]]; then + echoerr "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $HOST:$PORT" + fi + return $RESULT +} + +# process arguments +while [[ $# -gt 0 ]] +do + case "$1" in + *:* ) + hostport=(${1//:/ }) + HOST=${hostport[0]} + PORT=${hostport[1]} + shift 1 + ;; + --child) + CHILD=1 + shift 1 + ;; + -q | --quiet) + QUIET=1 + shift 1 + ;; + -s | --strict) + STRICT=1 + shift 1 + ;; + -h) + HOST="$2" + if [[ $HOST == "" ]]; then break; fi + shift 2 + ;; + --host=*) + HOST="${1#*=}" + shift 1 + ;; + -p) + PORT="$2" + if [[ $PORT == "" ]]; then break; fi + shift 2 + ;; + --port=*) + PORT="${1#*=}" + shift 1 + ;; + -t) + TIMEOUT="$2" + if [[ $TIMEOUT == "" ]]; then break; fi + shift 2 + ;; + --timeout=*) + TIMEOUT="${1#*=}" + shift 1 + ;; + --) + shift + CLI="$@" + break + ;; + --help) + usage + ;; + *) + echoerr "Unknown argument: $1" + usage + ;; + esac +done + +if [[ "$HOST" == "" || "$PORT" == "" ]]; then + echoerr "Error: you need to provide a host and port to test." + usage +fi + +TIMEOUT=${TIMEOUT:-15} +STRICT=${STRICT:-0} +CHILD=${CHILD:-0} +QUIET=${QUIET:-0} + +if [[ $CHILD -gt 0 ]]; then + wait_for + RESULT=$? + exit $RESULT +else + if [[ $TIMEOUT -gt 0 ]]; then + wait_for_wrapper + RESULT=$? + else + wait_for + RESULT=$? + fi +fi + +if [[ $CLI != "" ]]; then + if [[ $RESULT -ne 0 && $STRICT -eq 1 ]]; then + echoerr "$cmdname: strict mode, refusing to execute subprocess" + exit $RESULT + fi + exec $CLI +else + exit $RESULT +fi \ No newline at end of file diff --git a/webodm/settings.py b/webodm/settings.py index 96d246b7..f9771691 100644 --- a/webodm/settings.py +++ b/webodm/settings.py @@ -84,7 +84,7 @@ DATABASES = { 'NAME': 'webodm_dev', 'USER': 'postgres', 'PASSWORD': 'postgres', - 'HOST': '127.0.0.1', + 'HOST': 'db', 'PORT': '5432', } }