7 bash deploy.sh operation [options]
9 --build=num : build node images only
11 --run=image1,image2,...: run selected node images
13 --run-all: run all node images
15 --scale=num: build and run multiple node images
17 --list: list all node images
19 --remove=image1,image2,...: remove selected node images
21 --remove-all: remove all node images
23 --help: print usage message
28 docker run --rm -it --entrypoint cat $1 /usr/local/vapord/node_pubkey.txt
35 NC='\033[0m' # No Color
37 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
40 mkdir -p ${DOCKER_DIR}
42 # node and image names are PREFIX-pubkey[0:6]
44 IMG_PREFIX=vapord_test
45 WALLET_PORT_BEGIN=9889
47 ############## process commandline options ###############
50 # operation: build, run, run-all, all, list, remove, remove-all help
59 shift # past argument=value
64 shift # past argument=value
69 shift # past argument=value
78 shift # past argument=value
94 shift # past argument with no value
97 echo "unknown option $i"
104 echo "options: scale:${scale}, op:${op} op_arg:${op_arg}"
106 if [ "${op}" == "help" ]; then
111 if [ "${op}" == "down" ]; then
112 docker-compose -f ${DOCKER_DIR}/docker-compose.yml down
116 if [ -z "${scale}" ]; then
117 echo "please specify number of nodes to spawn."
120 elif [ "${scale}" -lt 1 ]; then
121 echo "number of nodes must be greater than 0"
130 ############## remove images ################
131 if [ "${op}" == "remove-all" ]; then
132 echo -e "${GREEN}removing all node images${NC}"
133 docker rmi $(docker images --filter=reference="${IMG_PREFIX}-*:*" -q)
135 elif [ "${op}" == "remove" ]; then
136 if [ -z "${op_arg}" ]; then
137 echo -e "${RED}must specify which image(s) to remove${NC}"
140 IFS=',' read -r -a img_array <<< "${op_arg}"
141 for img in "${img_array[@]}"; do
142 if [[ "${img}" =~ ^${IMG_PREFIX}-* ]]; then
143 echo -e "${GREEN}removing image ${img}${NC}"
146 echo -e "${RED}invalid image name ${img}${NC}"
152 ############### list images ################
153 if [ "${op}" == "list" ]; then
154 echo -e "${GREEN}list all node images${NC}"
155 docker images --filter=reference="${IMG_PREFIX}-*:*"
157 printf "${CYAN}image name\t\tpublic key${NC}\n"
158 img_array=(`docker images --filter=reference="${IMG_PREFIX}-*:*" --format "{{.Repository}}"`)
159 for img in "${img_array[@]}"; do
160 pubkey=$( get_pubkey ${img} )
161 if [ -z "${pubkey}" ]; then
162 echo -e "${RED}failed to get public key${NC} for node ${img}"
165 printf "${img}\t${pubkey}\n"
170 ############### build images ################
171 if [[ "${op}" == "build" || "${op}" == "all" ]]; then
172 for ((i = 1 ; i <= ${scale} ; i++)); do
173 echo -e "${GREEN}building docker image for node #${i}${NC}"
174 docker build --rm -t vapord_tmp . -f ${SCRIPT_DIR}/vapord.Dockerfile
175 # /usr/local/vapord/node_pubkey.txt is the location storing pub_key of node defined in dockerfile
176 pubkey=$( get_pubkey vapord_tmp )
177 if [ -z "${pubkey}" ]; then
178 echo -e "${RED}failed to get public key${NC} for node ${i}"
181 node_tag=`echo "${pubkey}" | cut -c1-6`
182 img=${IMG_PREFIX}-${node_tag}
183 docker tag vapord_tmp ${img}:latest
184 docker rmi vapord_tmp
185 docker image prune -f --filter label=stage=vapord_builder > /dev/null
186 key_array+=(${pubkey})
187 node_array+=(${NODE_PREFIX}-${node_tag})
192 ############### generate docker-compose.yml for the network ###############
193 if [ "${op}" == "run" ]; then
194 if [ -z "${op_arg}" ]; then
195 echo -e "${RED}must specify which image(s) to run${NC}"
200 IFS=',' read -r -a img_array <<< "${op_arg}"
201 for img in "${img_array[@]}"; do
202 if ! [[ "${img}" =~ ^${IMG_PREFIX}-* ]]; then
203 echo -e "${RED}invalid image name ${img}${NC}"
206 if [[ "$(docker images -q ${img}:latest 2> /dev/null)" == "" ]]; then
207 echo -e "${RED}image ${img}:latest does not exist${NC}"
210 hash=`echo ${img} | cut -d- -f 2`
211 node_array+=(${NODE_PREFIX}-${hash})
213 pubkey=$( get_pubkey ${img} )
214 if [ -z "${pubkey}" ]; then
215 echo -e "${RED}failed to get public key${NC} for node ${img}"
218 key_array+=(${pubkey})
220 elif [ "${op}" == "run-all" ]; then
221 img_array=(`docker images --filter=reference="${IMG_PREFIX}-*:*" --format "{{.Repository}}"`)
222 for img in "${img_array[@]}"; do
223 hash=`echo ${img} | cut -d- -f 2`
224 node_array+=(${NODE_PREFIX}-${hash})
226 pubkey=$( get_pubkey ${img} )
227 if [ -z "${pubkey}" ]; then
228 echo -e "${RED}failed to get public key${NC} for node ${img}"
231 key_array+=(${pubkey})
235 printf "${CYAN}image name\t\tnode name\tpublic key${NC}\n"
237 for id in "${!img_array[@]}"; do
238 node=${node_array[id]}
240 pubkey=${key_array[id]}
241 printf "${img}\t${node}\t${pubkey}\n"
244 if [ "${op}" == "build" ]; then
248 echo "### DO NOT MODIFY. THIS FILE IS AUTO GEN FROM deploy.sh ###" > ${DOCKER_DIR}/docker-compose.yml
249 echo "version: '2'" >> ${DOCKER_DIR}/docker-compose.yml
250 echo "services:" >> ${DOCKER_DIR}/docker-compose.yml
252 for id in "${!img_array[@]}"; do
253 node=${node_array[id]}
255 echo -e "${GREEN}setup service for node ${node}${NC}"
256 name=${node} image=${img}:latest port=$(( id + WALLET_PORT_BEGIN )) envsubst '${name} ${image} ${port}' < ${SCRIPT_DIR}/docker-compose.yml.tpl >> ${DOCKER_DIR}/docker-compose.yml
257 echo >> ${DOCKER_DIR}/docker-compose.yml
260 ############### start network ###############
261 echo -e "${GREEN}network up...${NC}"
262 docker-compose -f ${DOCKER_DIR}/docker-compose.yml up -d