forked from openstack-archive/refstack
-
Notifications
You must be signed in to change notification settings - Fork 0
/
run-in-docker
executable file
·153 lines (143 loc) · 5.49 KB
/
run-in-docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/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:8000"
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}