refstack/run-in-docker

154 lines
5.5 KiB
Bash
Executable File

#!/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}