From d27d04398a98a049e679e874851b895e3ca0833f Mon Sep 17 00:00:00 2001 From: Olivier DOSSMANN Date: Tue, 12 Jan 2016 17:55:42 +0100 Subject: [PATCH] [IMP] Complete Docker launch script: * Add start command * Add stop command * Add migrate command --- config | 11 ++++++- launch.sh | 92 ++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 91 insertions(+), 12 deletions(-) diff --git a/config b/config index 77ed5cc..c1761f5 100644 --- a/config +++ b/config @@ -1,7 +1,16 @@ #!/usr/bin/env bash - +# +# config +# +# This file gives parameters to launch Docker containers for Gissmo projects. +# +# PROJECT_DIR: will contains all python libraries and gissmo git repository +# GISSMO_VERSION: used to generated Gissmo Docker image name. PROJECT_DIR="/home/olivier/gissmo_project" POSTGRES_VERSION="9.5" POSTGRES_DOCKER_NAME="gissmo_db" DB_VOLUME_NAME="dbdata" +GIT_BRANCH="restful" +GISSMO_VERSION="1.5" +GISSMO_DOCKER_PORT="8002" diff --git a/launch.sh b/launch.sh index fe83dc4..cc56679 100755 --- a/launch.sh +++ b/launch.sh @@ -4,12 +4,15 @@ ## Default PROGRAM=`basename $0` +docker_cmd=`which docker` +CURRENT_DIR=$(pwd) GIT_URL="git@github.com:eost/gissmo.git" GIT_BRANCH="dev" # Default Git Branch GIT_DIR_NAME="gissmo" DOCKERFILE_NAME="Dockerfile" DB_DIR="/dbdata" POSTGRES_VERSION="9.5" +GISSMO_DOCKER_NAME="gissmo" ## User . config || exit 1 @@ -19,6 +22,7 @@ GISSMO_DIR="${PROJECT_DIR}/${GIT_DIR_NAME}" DOCKERFILE="${GISSMO_DIR}/${DOCKERFILE_NAME}" COMMAND="$1" +shift 1; ARGS="$@" # METHODS @@ -44,9 +48,13 @@ show_help() { echo -e " Where COMMAND is one of:" echo -e " - create Create postgreSQL database volume and postgreSQL Docker container" echo -e " - init Create project directory as python virtual environment, fetch git repository and install Python dependancies" + echo -e " - migrate Launch migration command: python manage.py migrate" echo -e " - restore " - echo -e " - start " - echo -e " - stop " + echo -e " - start Launch Gissmo Docker container (created by 'create' command) with a name given in GISSMO_DOCKER_NAME variable" + echo -e " - stop Stop Gissmo Docker container which name is GISSMO_DOCKER_NAME variable content" + # TODO: Add clean() command to STOP and DELETE Gissmo Docker container + # TODO: Add clean_db() command to STOP and DELETE postgreSQL Docker container + # TODO: Add clean_all() command that makes clean() and clean_db() } check_command() { @@ -54,6 +62,8 @@ check_command() { return 0 elif test $1 == "init"; then return 0 + elif test $1 == "migrate"; then + return 0 elif test $1 == "restore"; then return 0 elif test $1 == "start"; then @@ -66,11 +76,30 @@ check_command() { exit 1 } -test_create() { - docker_cmd=`which docker` +test_docker_cmd() { if test -z "$docker_cmd"; then error_and_quit "Docker command not found. Install docker or fill in the PATH." fi + return 0 +} + +test_postgresql_exists() { + PSQL_RUNNING=$($docker_cmd inspect --format="{{ .State.Running }}" ${POSTGRES_DOCKER_NAME} 2> /dev/null) + if [ $? -eq 1 ]; then + error_and_quit "postgreSQL Docker container not found: ${POSTGRES_DOCKER_NAME}. Please launch '$PROGRAM create' first." + fi +} + +test_postgresql_launched() { + PSQL_RUNNING=$($docker_cmd inspect --format="{{ .State.Running }}" ${POSTGRES_DOCKER_NAME} 2> /dev/null) + if test $PSQL_RUNNING == "false"; then + return 1 + fi + return 0 +} + +test_create() { + test_docker_cmd if test -z "$DB_DIR"; then error_and_quit "No database directory given (DB_DIR in config file)." fi @@ -105,7 +134,7 @@ init() { sudo apt-get install -qq libpq-dev python3-dev python-virtualenv git-core python3-pip || error_and_quit "Dependancies installation failed." info "Dependancies via apt-get checked/installed." if ! test -d "$GISSMO_DIR/.git/"; then - git clone -q $GIT_URL $GISSMO_DIR || error_and_quit "Fetch Git repository failed." + git clone -q -b "$GIT_BRANCH" "$GIT_URL" "$GISSMO_DIR" || error_and_quit "Fetch Git repository failed." else GIT_WORK_TREE="${GISSMO_DIR}/" GIT_DIR="${GISSMO_DIR}/.git/" git pull -q origin master || error_and_quit "Pull command on Git repository failed." fi @@ -117,20 +146,61 @@ init() { deactivate || error_and_quit "Failed exiting python virtual environment." } +test_migrate() { + test_start +} + +migrate() { + test_migrate + $docker_cmd run -it --rm --link ${POSTGRES_DOCKER_NAME}:db gissmo:${GISSMO_VERSION} python manage.py migrate || error_and_quit "Failed to launch Gissmo migration." +} + restore() { not_implemented } +test_start() { + if test -z "$GISSMO_VERSION"; then + error_and_quit "No Gissmo version given (GISSMO_VERSION in config file)." + fi + if test -z "$GISSMO_DOCKER_PORT"; then + error_and_quit "No Gissmo Docker container port given (GISSMO_DOCKER_PORT in config file)." + fi + test_postgresql_exists +} + start() { - not_implemented + test_start + # Build Gissmo Docker images if missing + if [[ "$($docker_cmd images -q gissmo:${GISSMO_VERSION} 2> /dev/null)" == "" ]]; then + cd $GISSMO_DIR + $docker_cmd build -t gissmo:${GISSMO_VERSION} . || error_and_quit "Failed to build Gissmo Docker container." + cd $CURRENT_DIR + fi + # Check postgreSQL Docker container exists and is launched. + test_postgresql_launched + if [ $? -eq 1 ]; then + $docker_cmd start ${POSTGRES_DOCKER_NAME} + fi + # Run existing Docker container, otherwise create a new one + GISSMO_RUNNING=$($docker_cmd inspect --format="{{ .State.Running }}" ${GISSMO_DOCKER_NAME} 2> /dev/null) + if [ $? -eq 1 ]; then + $docker_cmd run -it --rm --link ${POSTGRES_DOCKER_NAME}:db -p ${GISSMO_DOCKER_PORT}:8000 --name ${GISSMO_DOCKER_NAME} gissmo:${GISSMO_VERSION} $ARGS || error_and_quit "Failed to create and launch ${GISSMO_DOCKER_NAME} container." + else + error_and_quit "${GISSMO_DOCKER_NAME} is already launched!" + fi +} + +test_stop(){ + GISSMO_RUNNING=$($docker_cmd inspect --format="{{ .State.Running }}" ${GISSMO_DOCKER_NAME}) + if [ $? -eq 1 ]; then + error_and_quit "Gissmo Docker container not found: ${GISSMO_DOCKER_NAME}. Please launch '$PROGRAM launch' first." + fi } stop() { - not_implemented -} - -generate_database_persistent_volume() { - not_implemented + $docker_cmd stop $GISSMO_DOCKER_NAME || error_and_quit "Failed to stop $GISSMO_DOCKER_NAME Docker container." + info "${GISSMO_DOCKER_NAME} Docker container stopped successfully." }