#!/bin/bash TAG=$(BRANCH=$(git status -bs| grep "##" | awk '{print $2}'); echo ${BRANCH##*/}) IMAGE="refstack:${TAG}" CONTAINER="refstack_${TAG}" PROJ_DIR=$(git rev-parse --show-toplevel) function usage () { set +x echo "Usage: $0 [OPTIONS] [COMMAND]" echo "Build '${IMAGE}' image if it is does not exist." echo "Run '${CONTAINER}' container and execute COMMAND in it." echo "Default COMMAND is 'api-up'" echo "If container '${CONTAINER}' exists (running or stopped) it will be reused." echo "If you want to get access to your local RefStack not only from localhost, " echo "please specify public RefStack host:port in env[REFSTACK_HOST]." echo "You can customize RefStack API config by editing docker/refstack.conf.tmpl." echo "It is bash template. You can use \${SOME_ENV_VARIABLE} in it." echo "Default is 127.0.0.1:443" echo "" echo " -r Force delete '${CONTAINER}' container and run it again." echo " Main usecase for it - updating config from templates" echo " -b Force delete '${IMAGE}' image and build it again" echo " Main usecase for it - force build new python/js env" echo " -i Run container with isolated MySQL data." echo " By default MySQL data stores in refstack_data_DATA-BASE-REVISON container" echo " It reuses if such container exists. If you want to drop DB data, just execute" echo " sudo docker rm refstack_data_DATA-BASE-REVISON" echo " -d Turn on debug information" echo " -h Print this usage message" echo "" echo "" echo "Using examples:" echo "" echo "Run RefStack API:" echo "$ ./run-in-docker" echo "" echo "Run RefStack API by hands:" echo "$ ./run-in-docker bash" echo "$ activate" echo "$ pecan serve refstack/api/config.py" echo "" echo "Open shell in container:" echo "$ ./run-in-docker bash" echo "" echo "Open mysql console in container:" echo "$ ./run-in-docker bash" echo "$ mysql" } build_image () { sudo docker rm -f ${CONTAINER} PREV_ID=$(sudo docker images refstack | grep ${TAG} | awk '{print $3}') echo "Try to build ${IMAGE} image" sudo docker build -t ${IMAGE} -f ${PROJ_DIR}/docker/Dockerfile ${PROJ_DIR} || exit $? NEW_ID=$(sudo docker images refstack | grep ${TAG} | awk '{print $3}') if [[ ${PREV_ID} ]] && [[ ! ${PREV_ID} == ${NEW_ID} ]]; then sudo docker rmi -f ${PREV_ID} && echo "Previous image removed" fi } wait_ready() { while true; do echo "Wait while container is not ready" sudo docker exec ${CONTAINER} [ ! -e /tmp/is-not-ready ] && \ echo "Container ${CONTAINER} is running!" && break sleep 1 done } run_container (){ echo "Stop all other refstack containers" for id in $(sudo docker ps -q); do NAME=$(sudo docker inspect --format='{{.Name}}' $id) if [[ ${NAME} == /refstack_* ]] && [[ ! ${NAME} == "/${CONTAINER}" ]]; then echo "Stopped container ${NAME}" && sudo docker stop $id fi done if [[ $(sudo docker ps -a | grep "${CONTAINER}") ]]; then echo "Container ${CONTAINER} exists it is reused" sudo docker start ${CONTAINER} wait_ready else echo "Try to run container ${CONTAINER}" sudo docker run -d \ -e REFSTACK_HOST=${REFSTACK_HOST:-127.0.0.1} \ -e DEBUG_MODE=${DEBUG_MODE} \ -v ${PROJ_DIR}:/refstack:ro -p 443:443 --name ${CONTAINER} \ ${IMAGE} start.sh -s wait_ready if [[ ! ${ISOLATED_DB} ]]; then DB_VERSION=$(sudo docker exec -it ${CONTAINER} api-db-version) DB_CONTAINER=refstack_data_${DB_VERSION::-1} sudo docker rm -f ${CONTAINER} if [[ ! $(sudo docker ps -a | grep "${DB_CONTAINER}") ]]; then sudo docker run -v /home/dev/mysql --name ${DB_CONTAINER} ubuntu /bin/true echo "Container with mysql data ${DB_CONTAINER} created" sudo docker run -d \ -e REFSTACK_HOST=${REFSTACK_HOST:-127.0.0.1} \ -e DEBUG_MODE=${DEBUG_MODE} \ -v ${PROJ_DIR}:/refstack:ro --volumes-from ${DB_CONTAINER} -p 443:443 \ --name ${CONTAINER} ${IMAGE} wait_ready sudo docker exec ${CONTAINER} api-init-db echo "DB init done" else sudo docker run -d \ -e REFSTACK_HOST=${REFSTACK_HOST:-127.0.0.1} \ -e DEBUG_MODE=${DEBUG_MODE} \ -v ${PROJ_DIR}:/refstack:ro --volumes-from ${DB_CONTAINER} -p 443:443 \ --name ${CONTAINER} ${IMAGE} echo "Container with mysql data ${DB_CONTAINER} attached to ${CONTAINER}" wait_ready fi fi fi } COMMAND="" while [[ $1 ]] do case "$1" in -h) usage exit 0;; -r) echo "Try to remove old ${CONTAINER} container" sudo docker rm -f ${CONTAINER} shift;; -i) echo "Run container with isolated MySQL data." echo "By default MySQL data stores in refstack_data_[DATA-BASE-REVISON] container" echo "It reuses if such container exists. If you want to drop DB data, just execute" echo "sudo docker rm ${DB_CONTAINER}" ISOLATED_DB=true shift;; -b) FORCE_BUILD=true shift;; -d) DEBUG_MODE=true shift;; *) COMMAND="${COMMAND} $1" shift;; esac done [[ ${DEBUG_MODE} ]] && set -x #Build proper image if it does not exist of force rebuild fired if [[ ${FORCE_BUILD} ]] || [[ ! $(sudo docker images refstack | grep ${TAG}) ]]; then build_image fi #Run or start(if it exists) proper container [[ ! $(sudo docker ps | grep ${CONTAINER}) ]] && run_container sudo docker exec -it ${CONTAINER} ${COMMAND:-api-up}