7 bash deploy.sh operation [options]
9 --build=num : build node images
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
52 op_arg="vapord_test-2951a1"
54 # Call getopt to validate the provided input.
55 options=$(getopt -o brg --long build:run:run-all:list:rm:rm-all:scale:help:down -- "$@")
57 echo "Incorrect options provided"
61 eval set -- "$options"
89 shift; # The arg is next in position args
107 echo "options: scale:${scale}, op:${op} op_arg:${op_arg}"
109 if [ "${op}" == "help" ]; then
114 if [ "${op}" == "down" ]; then
115 docker-compose -f ${DOCKER_DIR}/docker-compose.yml down
119 if [ -z "${scale}" ]; then
120 echo "please specify number of nodes to spawn."
123 elif [ "${scale}" -lt 1 ]; then
124 echo "number of nodes must be greater than 0"
133 ############## remove images ################
134 if [ "${op}" == "remove-all" ]; then
135 echo -e "${GREEN}removing all node images${NC}"
136 docker rmi $(docker images --filter=reference="${IMG_PREFIX}-*:*" -q)
138 elif [ "${op}" == "remove" ]; then
139 if [ -z "${op_arg}" ]; then
140 echo -e "${RED}must specify which image(s) to remove${NC}"
143 IFS=',' read -r -a img_array <<< "${op_arg}"
144 for img in "${img_array[@]}"; do
145 if [[ "${img}" =~ ^${IMG_PREFIX}-* ]]; then
146 echo -e "${GREEN}removing image ${img}${NC}"
149 echo -e "${RED}invalid image name ${img}${NC}"
155 ############### list images ################
156 if [ "${op}" == "list" ]; then
157 echo -e "${GREEN}list all node images${NC}"
158 docker images --filter=reference="${IMG_PREFIX}-*:*"
161 img_array=(`docker images --filter=reference="${IMG_PREFIX}-*:*" --format "{{.Repository}}"`)
162 for img in "${img_array[@]}"; do
163 pubkey=$( get_pubkey ${img} )
164 if [ -z "${pubkey}" ]; then
165 echo -e "${RED}failed to get public key${NC} for node ${img}"
168 printf "${img}\t${pubkey}\n"
173 ############### build images ################
174 if [[ "${op}" == "build" || "${op}" == "all" ]]; then
175 for ((i = 1 ; i <= ${scale} ; i++)); do
176 echo -e "${GREEN}building docker image for node #${i}${NC}"
177 docker build --rm -t vapord_tmp . -f ${SCRIPT_DIR}/vapord.Dockerfile
178 # /usr/local/vapord/node_pubkey.txt is the location storing pub_key of node defined in dockerfile
179 pubkey=$( get_pubkey vapord_tmp )
180 if [ -z "${pubkey}" ]; then
181 echo -e "${RED}failed to get public key${NC} for node ${i}"
184 node_tag=`echo "${pubkey}" | cut -c1-6`
185 img=${IMG_PREFIX}-${node_tag}
186 docker tag vapord_tmp ${img}:latest
187 docker rmi vapord_tmp
188 docker image prune -f --filter label=stage=vapord_builder > /dev/null
189 key_array+=(${pubkey})
190 node_array+=(${NODE_PREFIX}-${node_tag})
195 ############### generate docker-compose.yml for the network ###############
196 if [ "${op}" == "run" ]; then
197 if [ -z "${op_arg}" ]; then
198 echo -e "${RED}must specify which image(s) to run${NC}"
203 IFS=',' read -r -a img_array <<< "${op_arg}"
204 for img in "${img_array[@]}"; do
205 if ! [[ "${img}" =~ ^${IMG_PREFIX}-* ]]; then
206 echo -e "${RED}invalid image name ${img}${NC}"
209 if [[ "$(docker images -q ${img}:latest 2> /dev/null)" == "" ]]; then
210 echo -e "${RED}image ${img}:latest does not exist${NC}"
213 hash=`echo ${img} | cut -d- -f 2`
214 node_array+=(${NODE_PREFIX}-${hash})
216 pubkey=$( get_pubkey ${img} )
217 if [ -z "${pubkey}" ]; then
218 echo -e "${RED}failed to get public key${NC} for node ${img}"
221 key_array+=(${pubkey})
223 elif [ "${op}" == "run-all" ]; then
224 img_array=(`docker images --filter=reference="${IMG_PREFIX}-*:*" --format "{{.Repository}}"`)
225 for img in "${img_array[@]}"; do
226 hash=`echo ${img} | cut -d- -f 2`
227 node_array+=(${NODE_PREFIX}-${hash})
229 pubkey=$( get_pubkey ${img} )
230 if [ -z "${pubkey}" ]; then
231 echo -e "${RED}failed to get public key${NC} for node ${img}"
234 key_array+=(${pubkey})
238 echo -e "image/node/pkey"
240 for id in "${!img_array[@]}"; do
241 node=${node_array[id]}
243 pubkey=${key_array[id]}
244 printf "${img}\t${node}\t${pubkey}\n"
247 if [ "${op}" == "build" ]; then
251 echo "### DO NOT MODIFY. THIS FILE IS AUTO GEN FROM deploy.sh ###" > ${DOCKER_DIR}/docker-compose.yml
252 echo "version: '2'" >> ${DOCKER_DIR}/docker-compose.yml
253 echo "services:" >> ${DOCKER_DIR}/docker-compose.yml
255 for id in "${!img_array[@]}"; do
256 node=${node_array[id]}
258 echo -e "${GREEN}setup service for node ${node}${NC}"
259 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
260 echo >> ${DOCKER_DIR}/docker-compose.yml
263 ############### start network ###############
264 echo -e "${GREEN}network up...${NC}"
265 docker-compose -f ${DOCKER_DIR}/docker-compose.yml up -d