b0f40107b1
run-in-docker starts the refstack server on port 443 with a self-signed cert. Update the documentation to change the default port from 8000 to 443 Change-Id: I21e6451ce623f83e938bef5aeaee14835a660392
154 lines
5.5 KiB
Bash
Executable File
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}
|