You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
5.3 KiB
170 lines
5.3 KiB
#!/usr/bin/env bash
|
|
# Helper script that builds and launches the Docker containers.
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
function print_help {
|
|
echo "`basename "$0"` {options}"
|
|
echo " Build and launch the \"asl-articles\" containers."
|
|
echo
|
|
echo " -t --tag Docker container tag e.g. \"testing\" or \"latest\"."
|
|
echo " -d --dbconn Database connection string e.g."
|
|
echo " ~/asl-articles.db (path to a SQLite database)"
|
|
echo " postgresql://USER:PASS@host/dbname (database connection string)"
|
|
echo " Note that the database server address is relative to the container i.e. NOT \"localhost\"."
|
|
echo " --web-portno Webapp port number."
|
|
echo " --flask-portno Flask backend server port number."
|
|
echo " -e --extdocs Base directory for external documents (to allow articles to link to them)."
|
|
echo " -u --user-files Base directory for user files."
|
|
echo " -r --aslrb Base URL for an eASLRB."
|
|
echo " -a --author-aliases Author aliases config file (see config/author-aliases.cfg.example)."
|
|
echo " --no-build Launch the containers as they are (i.e. without rebuilding them first)."
|
|
echo " --build-network Docker network to use when building the container."
|
|
}
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
# initialize
|
|
cd `dirname "$0"`
|
|
export TAG=
|
|
export DBCONN=
|
|
export SQLITE=
|
|
export WEB_PORTNO=3002
|
|
export FLASK_PORTNO=5002
|
|
export EXTERNAL_DOCS_BASEDIR=
|
|
export USER_FILES_BASEDIR=
|
|
export ASLRB_BASE_URL=
|
|
export AUTHOR_ALIASES=
|
|
export ENABLE_TESTS=
|
|
NO_BUILD=
|
|
export BUILD_NETWORK=
|
|
export DOCKER_UID=$(id -u)
|
|
export DOCKER_GID=$(id -g)
|
|
|
|
# parse the command-line arguments
|
|
if [ $# -eq 0 ]; then
|
|
print_help
|
|
exit 0
|
|
fi
|
|
params="$(getopt -o t:d:e:u:r:a:h -l tag:,dbconn:,web-portno:,flask-portno:,extdocs:,user-files:,aslrb:,author-aliases:,no-build,build-network:,help --name "$0" -- "$@")"
|
|
if [ $? -ne 0 ]; then exit 1; fi
|
|
eval set -- "$params"
|
|
while true; do
|
|
case "$1" in
|
|
-t | --tag )
|
|
TAG=$2
|
|
shift 2 ;;
|
|
-d | --dbconn )
|
|
DBCONN=$2
|
|
shift 2 ;;
|
|
--web-portno )
|
|
WEB_PORTNO=$2
|
|
shift 2 ;;
|
|
--flask-portno )
|
|
FLASK_PORTNO=$2
|
|
shift 2 ;;
|
|
-e | --extdocs )
|
|
EXTERNAL_DOCS_BASEDIR=$2
|
|
shift 2 ;;
|
|
-u | --user-files )
|
|
USER_FILES_BASEDIR=$2
|
|
shift 2 ;;
|
|
-r | --aslrb )
|
|
ASLRB_BASE_URL=$2
|
|
shift 2 ;;
|
|
-a | --author-aliases )
|
|
AUTHOR_ALIASES=$2
|
|
shift 2 ;;
|
|
--no-build )
|
|
NO_BUILD=1
|
|
shift 1 ;;
|
|
--build-network )
|
|
# FUDGE! We sometimes can't get out to the internet from the container (DNS problems) using the default
|
|
# "bridge" network, so we offer the option of using an alternate network (e.g. "host").
|
|
BUILD_NETWORK=$2
|
|
shift 2 ;;
|
|
-h | --help )
|
|
print_help
|
|
exit 0 ;;
|
|
-- ) shift ; break ;;
|
|
* )
|
|
echo "Unknown option: $1" >&2
|
|
exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
# prepare the database connection string
|
|
if [ -z "$DBCONN" ]; then
|
|
echo "No database was specified."
|
|
exit 3
|
|
fi
|
|
if [ -f "$DBCONN" ]; then
|
|
# connect to a SQLite database
|
|
SQLITE=$DBCONN
|
|
DBCONN=sqlite:////data/sqlite.db
|
|
else
|
|
# FUDGE! We pass the database connection string (DBCONN) through to the container,
|
|
# but this needs to be set, even if it's not being used :-/
|
|
SQLITE=/dev/null
|
|
fi
|
|
|
|
# initialize for testing
|
|
if [ "$TAG" == "testing" ]; then
|
|
echo -e "*** WARNING! Test mode is enabled! ***\n"
|
|
ENABLE_TESTS=1
|
|
else
|
|
if [ -z "$TAG" ]; then
|
|
TAG=latest
|
|
fi
|
|
fi
|
|
|
|
# check the external documents directory
|
|
if [ -n "$EXTERNAL_DOCS_BASEDIR" ]; then
|
|
if [ ! -d "$EXTERNAL_DOCS_BASEDIR" ]; then
|
|
echo "Can't find the external documents base directory: $EXTERNAL_DOCS_BASEDIR"
|
|
exit 1
|
|
fi
|
|
else
|
|
# FUDGE! This needs to be set, even if it's not being used :-/
|
|
EXTERNAL_DOCS_BASEDIR=/dev/null
|
|
fi
|
|
|
|
# check the user files directory
|
|
if [ -n "$USER_FILES_BASEDIR" ]; then
|
|
if [ ! -d "$USER_FILES_BASEDIR" ]; then
|
|
echo "Can't find the user files base directory: $USER_FILES_BASEDIR"
|
|
exit 1
|
|
fi
|
|
else
|
|
# FUDGE! This needs to be set, even if it's not being used :-/
|
|
USER_FILES_BASEDIR=/dev/null
|
|
fi
|
|
|
|
# check the author aliases
|
|
if [ -n "$AUTHOR_ALIASES" ]; then
|
|
if [ ! -f "$AUTHOR_ALIASES" ]; then
|
|
echo "Can't find the author aliases config file: $AUTHOR_ALIASES"
|
|
exit 1
|
|
fi
|
|
else
|
|
# FUDGE! This needs to be set, even if it's not being used :-/
|
|
AUTHOR_ALIASES=/dev/null
|
|
fi
|
|
|
|
# build the containers
|
|
if [ -z "$NO_BUILD" ]; then
|
|
echo Building the \"$TAG\" containers...
|
|
docker-compose build --build-arg ENABLE_TESTS=$ENABLE_TESTS 2>&1 \
|
|
| sed -e 's/^/ /'
|
|
if [ ${PIPESTATUS[0]} -ne 0 ]; then exit 10 ; fi
|
|
echo
|
|
fi
|
|
|
|
# launch the containers
|
|
echo Launching the \"$TAG\" containers...
|
|
if [ -n "$ENABLE_TESTS" ]; then
|
|
echo " *** TEST MODE ***"
|
|
fi
|
|
docker-compose up --detach 2>&1 \
|
|
| sed -e 's/^/ /'
|
|
exit ${PIPESTATUS[0]}
|
|
|