OSDN Git Service

dockerize vapord (#214) fix_lru_vote
authorapolloww <32606824+apolloww@users.noreply.github.com>
Thu, 20 Jun 2019 12:08:57 +0000 (20:08 +0800)
committerPaladz <yzhu101@uottawa.ca>
Thu, 20 Jun 2019 12:08:57 +0000 (20:08 +0800)
docker/vapord/README.md [new file with mode: 0644]
docker/vapord/config.toml [new file with mode: 0644]
docker/vapord/deploy.sh [new file with mode: 0644]
docker/vapord/docker-compose.yml.tpl [new file with mode: 0644]
docker/vapord/federation.json [new file with mode: 0755]
docker/vapord/supervisord.conf [new file with mode: 0644]
docker/vapord/vapord.Dockerfile [new file with mode: 0644]

diff --git a/docker/vapord/README.md b/docker/vapord/README.md
new file mode 100644 (file)
index 0000000..fbe6666
--- /dev/null
@@ -0,0 +1,66 @@
+# quick start
+
+execute deploy.sh at the root of vapor repo
+
+## usage
+
+```bash
+bash deploy.sh --help
+```
+
+## build and run a 2-node vapor nodes
+
+```bash
+bash deploy.sh --scale=2
+```
+
+## list available node images and public keys
+
+```bash
+bash deploy.sh --list
+```
+
+## remove all node images
+
+```bash
+bash deploy.sh --rm-all
+```
+
+## remove 2 images
+
+```bash
+bash deploy.sh --rm=vapord_test-ade32,vapord_test-342de
+```
+
+## build 2 vapord images (build only)
+
+```bash
+bash deploy.sh --build=2
+```
+
+## run 2 vapor nodes from existing images
+
+```bash
+bash deploy.sh --run=vapord_test-ade32,vapord_test-342de
+```
+
+## run vapor node from all existing images
+
+```bash
+bash deploy.sh --run-all
+```
+
+## bring down running nodes
+
+```bash
+bash deploy.sh --down
+```
+
+## node naming
+
+* id: first 5 chars of public key
+* node_name : vapord-${id}
+* image name: vapord_test-${id}:latest
+* wallet port : start from 9889, and increases by 1 every time a new node image is created.
+* log location: ~/vapord/log/${node_name}
+* docker-compose.yml location: ~/vapord/docker-compose.yml
diff --git a/docker/vapord/config.toml b/docker/vapord/config.toml
new file mode 100644 (file)
index 0000000..0b8a353
--- /dev/null
@@ -0,0 +1,10 @@
+# This is a TOML config file.
+# For more information, see https://github.com/toml-lang/toml
+fast_sync = true
+db_backend = "leveldb"
+api_addr = "0.0.0.0:9889"
+moniker = ""
+chain_id = "vapor"
+[p2p]
+laddr = "tcp://0.0.0.0:56659"
+seeds = "52.83.133.152:56659"
diff --git a/docker/vapord/deploy.sh b/docker/vapord/deploy.sh
new file mode 100644 (file)
index 0000000..1bdf21b
--- /dev/null
@@ -0,0 +1,265 @@
+#!/bin/bash
+
+set -e
+
+usage() {
+cat << EOF
+bash deploy.sh operation [options]
+operation
+    --build=num : build node images
+    
+    --run=image1,image2,...: run selected node images
+    
+    --run-all: run all node images
+    
+    --scale=num: build and run multiple node images
+
+    --list: list all node images
+
+    --remove=image1,image2,...: remove selected node images
+
+    --remove-all: remove all node images
+
+    --help: print usage message
+EOF
+}
+
+get_pubkey() {
+   docker run --rm -it --entrypoint cat $1 /usr/local/vapord/node_pubkey.txt 
+}
+
+# text colors
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+CYAN='\033[0;36m'
+NC='\033[0m' # No Color
+
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
+DOCKER_DIR=~/vapord
+
+mkdir -p ${DOCKER_DIR}
+
+# node and image names are PREFIX-pubkey[0:6]
+NODE_PREFIX=vapord
+IMG_PREFIX=vapord_test
+WALLET_PORT_BEGIN=9889
+
+############## process commandline options ###############
+# num of nodes
+scale=1
+# operation: build, run, run-all, all, list, remove, remove-all help
+op="all"
+op_arg="vapord_test-2951a1"
+
+# Call getopt to validate the provided input. 
+options=$(getopt -o brg --long build:run:run-all:list:rm:rm-all:scale:help:down -- "$@")
+[ $? -eq 0 ] || { 
+    echo "Incorrect options provided"
+    exit 1
+}
+
+eval set -- "$options"
+while true; do
+    case "$1" in
+    --build)
+        shift;
+        op="build"
+        scale=$1
+        ;;
+    --run)
+        shift;
+        op="run"
+        op_arg=$1
+        ;;
+    --run-all)
+        op="run-all"
+        ;;
+    --list)
+        op="list"
+        ;;
+    --rm)
+        shift;
+        op="remove"
+        op_arg=$1
+        ;;
+    --rm-all)
+        op="remove-all"
+        ;;
+    --scale)
+        shift; # The arg is next in position args
+        op="all"
+        scale=$1
+        ;;
+    --help)
+        op="help"
+        ;;
+    --down)
+        op="down"
+        ;;
+    --)
+        shift
+        break
+        ;;
+    esac
+    shift
+done
+
+echo "options: scale:${scale}, op:${op} op_arg:${op_arg}"
+
+if [ "${op}" == "help" ]; then
+    usage
+    exit
+fi
+
+if [ "${op}" == "down" ]; then
+    docker-compose -f ${DOCKER_DIR}/docker-compose.yml down
+    exit
+fi
+
+if [ -z "${scale}" ]; then
+    echo "please specify number of nodes to spawn."
+    usage
+    exit 1
+elif [ "${scale}" -lt 1 ]; then
+    echo "number of nodes must be greater than 0"
+    usage
+    exit 1
+fi
+
+key_array=()
+node_array=()
+img_array=()
+
+############## remove images ################
+if [ "${op}" == "remove-all" ]; then
+    echo -e "${GREEN}removing all node images${NC}"
+    docker rmi $(docker images --filter=reference="${IMG_PREFIX}-*:*" -q)
+    exit
+elif [ "${op}" == "remove" ]; then
+    if [ -z "${op_arg}" ]; then
+        echo -e "${RED}must specify which image(s) to remove${NC}"
+        exit 1
+    fi
+    IFS=',' read -r -a img_array <<< "${op_arg}"
+    for img in "${img_array[@]}"; do
+        if [[ "${img}" =~ ^${IMG_PREFIX}-* ]]; then
+            echo -e "${GREEN}removing image ${img}${NC}"
+            docker rmi $img
+        else
+            echo -e "${RED}invalid image name ${img}${NC}"
+        fi
+    done
+    exit
+fi
+
+############### list images ################
+if [ "${op}" == "list" ]; then
+    echo -e "${GREEN}list all node images${NC}"
+    docker images --filter=reference="${IMG_PREFIX}-*:*"
+    echo
+    echo "public keys"
+    img_array=(`docker images --filter=reference="${IMG_PREFIX}-*:*" --format "{{.Repository}}"`)
+    for img in "${img_array[@]}"; do
+        pubkey=$( get_pubkey ${img} )
+        if [ -z "${pubkey}" ]; then
+            echo -e "${RED}failed to get public key${NC} for node ${img}"
+            exit
+        fi
+        printf "${img}\t${pubkey}\n"
+    done
+    exit
+fi
+
+############### build images ################
+if [[ "${op}" == "build" || "${op}" == "all" ]]; then
+for ((i = 1 ; i <= ${scale} ; i++)); do
+    echo -e "${GREEN}building docker image for node #${i}${NC}"
+    docker build --rm -t vapord_tmp . -f ${SCRIPT_DIR}/vapord.Dockerfile
+    # /usr/local/vapord/node_pubkey.txt is the location storing pub_key of node defined in dockerfile
+    pubkey=$( get_pubkey vapord_tmp )
+    if [ -z "${pubkey}" ]; then
+        echo -e "${RED}failed to get public key${NC} for node ${i}"
+        exit
+    fi
+    node_tag=`echo "${pubkey}" | cut -c1-6`
+    img=${IMG_PREFIX}-${node_tag}
+    docker tag vapord_tmp ${img}:latest
+    docker rmi vapord_tmp
+    docker image prune -f --filter label=stage=vapord_builder > /dev/null
+    key_array+=(${pubkey})
+    node_array+=(${NODE_PREFIX}-${node_tag})
+    img_array+=(${img})
+done
+fi
+
+############### generate docker-compose.yml for the network ###############
+if [ "${op}" == "run" ]; then
+    if [ -z "${op_arg}" ]; then
+        echo -e "${RED}must specify which image(s) to run${NC}"
+        exit 1
+    fi
+    img_array=()
+    node_array=()
+    IFS=',' read -r -a img_array <<< "${op_arg}"
+    for img in "${img_array[@]}"; do
+        if ! [[ "${img}" =~ ^${IMG_PREFIX}-* ]]; then
+            echo -e "${RED}invalid image name ${img}${NC}"
+            exit 1
+        fi
+        if [[ "$(docker images -q ${img}:latest 2> /dev/null)" == "" ]]; then
+            echo -e "${RED}image ${img}:latest does not exist${NC}"
+            exit 1
+        fi
+        hash=`echo ${img} | cut -d- -f 2`
+        node_array+=(${NODE_PREFIX}-${hash})
+    
+        pubkey=$( get_pubkey ${img} )
+        if [ -z "${pubkey}" ]; then
+            echo -e "${RED}failed to get public key${NC} for node ${img}"
+            exit
+        fi
+        key_array+=(${pubkey})
+    done
+elif [ "${op}" == "run-all" ]; then
+    img_array=(`docker images --filter=reference="${IMG_PREFIX}-*:*" --format "{{.Repository}}"`)
+    for img in "${img_array[@]}"; do
+        hash=`echo ${img} | cut -d- -f 2`
+        node_array+=(${NODE_PREFIX}-${hash})
+        
+        pubkey=$( get_pubkey ${img} )
+        if [ -z "${pubkey}" ]; then
+            echo -e "${RED}failed to get public key${NC} for node ${img}"
+            exit
+        fi
+        key_array+=(${pubkey})
+    done
+fi
+
+echo -e "image/node/pkey"
+
+for id in "${!img_array[@]}"; do
+    node=${node_array[id]}
+    img=${img_array[id]}
+    pubkey=${key_array[id]}
+    printf "${img}\t${node}\t${pubkey}\n"
+done
+
+if [ "${op}" == "build" ]; then
+    exit
+fi
+
+echo "### DO NOT MODIFY. THIS FILE IS AUTO GEN FROM deploy.sh ###" > ${DOCKER_DIR}/docker-compose.yml 
+echo "version: '2'" >> ${DOCKER_DIR}/docker-compose.yml
+echo "services:" >> ${DOCKER_DIR}/docker-compose.yml
+
+for id in "${!img_array[@]}"; do
+    node=${node_array[id]}
+    img=${img_array[id]}
+    echo -e "${GREEN}setup service for node ${node}${NC}"
+    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
+    echo >> ${DOCKER_DIR}/docker-compose.yml 
+done
+
+############### start network ###############
+echo -e "${GREEN}network up...${NC}"
+docker-compose -f ${DOCKER_DIR}/docker-compose.yml up -d
diff --git a/docker/vapord/docker-compose.yml.tpl b/docker/vapord/docker-compose.yml.tpl
new file mode 100644 (file)
index 0000000..db9c014
--- /dev/null
@@ -0,0 +1,13 @@
+  ${name}:
+    container_name: ${name} 
+    image: ${image}
+    privileged: true
+    restart: always
+    #network_mode: host
+    ports:
+      - ${port}:9889
+      #- 56659:56659
+    volumes:
+      #- /etc/localtime:/etc/localtime
+      - ~/vapord/log/${name}:/var/log/vapord
+      
\ No newline at end of file
diff --git a/docker/vapord/federation.json b/docker/vapord/federation.json
new file mode 100755 (executable)
index 0000000..7ee1015
--- /dev/null
@@ -0,0 +1,6 @@
+{
+  "xpubs": [
+    "50ef22b3a3fca7bc08916187cc9ec2f4005c9c6b1353aa1decbd4be3f3bb0fbe1967589f0d9dec13a388c0412002d2c267bdf3b920864e1ddc50581be5604ce1"
+  ],
+  "quorum": 1
+}
diff --git a/docker/vapord/supervisord.conf b/docker/vapord/supervisord.conf
new file mode 100644 (file)
index 0000000..b568d26
--- /dev/null
@@ -0,0 +1,8 @@
+[program:vapord]
+command=/usr/local/vapord/vapord node -r /usr/local/vapord --auth.disable            ; the program (relative uses PATH, can take args)
+autorestart=true
+
+stdout_logfile=/var/log/vapord/node.log        ; stdout log path, NONE for none; default AUTO
+stderr_logfile=/var/log/vapord/node_err.log
+stdout_logfile_backups = 15
+stdout_logfile_maxbytes=100MB   ; max # logfile bytes b4 rotation (default 50MB)
diff --git a/docker/vapord/vapord.Dockerfile b/docker/vapord/vapord.Dockerfile
new file mode 100644 (file)
index 0000000..a669ac6
--- /dev/null
@@ -0,0 +1,19 @@
+FROM registry.cn-hangzhou.aliyuncs.com/matpool/golang-gcc-gpp:1.11.2 as builder
+LABEL stage=vapord_builder
+WORKDIR /go/src/github.com/vapor
+COPY . .
+RUN go build -o /usr/local/vapord/vapord ./cmd/bytomd/main.go
+# save node public key in /usr/local/vapord/node_pubkey.txt
+RUN /usr/local/vapord/vapord init --chain_id vapor -r /usr/local/vapord 2>&1 | grep -o 'pubkey=[a-z0-9]*' | cut -d'=' -f 2 > /usr/local/vapord/node_pubkey.txt
+COPY ./docker/vapord/config.toml /usr/local/vapord/config.toml
+COPY ./docker/vapord/federation.json /usr/local/vapord/federation.json
+
+###
+FROM registry.cn-hangzhou.aliyuncs.com/matpool/alpine-ca-supervisord:latest
+COPY ./docker/vapord/supervisord.conf /etc/supervisor/conf.d/vapord.conf
+COPY --from=builder /usr/local/vapord /usr/local/vapord
+RUN mkdir -p /var/log/vapord
+
+EXPOSE 9889 56659
+
+CMD []
\ No newline at end of file