From c6c993a1f1ceefb30addaaff92ea959fd9f077cc Mon Sep 17 00:00:00 2001 From: AnilChinchawale Date: Fri, 2 Nov 2018 16:54:20 +0530 Subject: [PATCH] add node docker image --- Dockerfile.node | 37 ++++++++ docker/XDCchain/entrypoint.sh | 162 ++++++++++++++++++++++++++++++++++ 2 files changed, 199 insertions(+) create mode 100644 Dockerfile.node create mode 100644 docker/XDCchain/entrypoint.sh diff --git a/Dockerfile.node b/Dockerfile.node new file mode 100644 index 0000000000..f7712acad7 --- /dev/null +++ b/Dockerfile.node @@ -0,0 +1,37 @@ + FROM golang:1.10-alpine as builder + + RUN apk add --no-cache make gcc musl-dev linux-headers + + ADD . /XDCchain + + RUN cd /XDCchain \ + && make XDC \ + && chmod +x /XDCchain/build/bin/XDC + + FROM alpine:latest + + LABEL maintainer="admin@xinfin.org" + + WORKDIR /XDCchain + + COPY --from=builder /XDCchain/build/bin/XDC /usr/local/bin/XDC + + ENV IDENTITY '' +ENV PASSWORD '' +ENV PRIVATE_KEY '' +ENV BOOTNODES '' +ENV EXTIP '' +ENV SYNC_MODE 'full' +ENV NETWORK_ID '89' +ENV WS_SECRET '' +ENV NETSTATS_HOST 'netstats-server' +ENV NETSTATS_PORT '3000' + + RUN apk add --no-cache ca-certificates + + COPY docker/XDCchain ./ +COPY genesis/ ./ + + EXPOSE 8545 8546 30303 30303/udp + + ENTRYPOINT ["./entrypoint.sh"] \ No newline at end of file diff --git a/docker/XDCchain/entrypoint.sh b/docker/XDCchain/entrypoint.sh new file mode 100644 index 0000000000..4e8753c291 --- /dev/null +++ b/docker/XDCchain/entrypoint.sh @@ -0,0 +1,162 @@ +#!/bin/sh -x + +# vars from docker env +# - IDENTITY (default to empty) +# - PASSWORD (default to empty) +# - PRIVATE_KEY (default to empty) +# - BOOTNODES (default to empty) +# - EXTIP (default to empty) +# - SYNC_MODE (default to 'full') +# - NETWORK_ID (default to '89') +# - WS_SECRET (default to empty) +# - NETSTATS_HOST (default to 'netstats-server:3000') +# - NETSTATS_PORT (default to 'netstats-server:3000') + +# constants +DATA_DIR="data" +KEYSTORE_DIR="keystore" + +# variables +genesisPath="" +params="" +accountsCount=$( + XDC account list --datadir $DATA_DIR --keystore $KEYSTORE_DIR \ + 2> /dev/null \ + | wc -l +) + +# file to env +for env in IDENTITY PASSWORD PRIVATE_KEY BOOTNODES WS_SECRET NETSTATS_HOST \ + NETSTATS_PORT EXTIP SYNC_MODE NETWORK_ID; do + file=$(eval echo "\$${env}_FILE") + if [[ -f $file ]] && [[ ! -z $file ]]; then + echo "Replacing $env by $file" + export $env=$(cat $file) + elif [[ "$env" == "BOOTNODES" ]] && [[ ! -z $file ]]; then + echo "Bootnodes file is not available. Waiting for it to be provisioned..." + while true ; do + if [[ -f $file ]] && [[ $(grep -e enode $file) ]]; then + echo "Fount bootnode file." + break + fi + echo "Still no bootnodes file, sleeping..." + sleep 5 + done + export $env=$(cat $file) + fi +done + +# networkid +if [[ ! -z $NETWORK_ID ]]; then + case $NETWORK_ID in + 88 ) + genesisPath="mainnet.json" + ;; + 89 ) + genesisPath="testnet.json" + ;; + 90 ) + genesisPath="devnet.json" + ;; + * ) + echo "network id not supported" + ;; + esac + params="$params --networkid $NETWORK_ID" +fi + +# data dir +if [[ ! -d $DATA_DIR/XDC ]]; then + echo "No blockchain data, creating genesis block." + XDC init $genesisPath --datadir $DATA_DIR 2> /dev/null +fi + +# identity +if [[ -z $IDENTITY ]]; then + IDENTITY="unnamed_$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6)" +fi + +# password file +if [[ ! -f ./password ]]; then + if [[ ! -z $PASSWORD ]]; then + echo "Password env is set. Writing into file." + echo "$PASSWORD" > ./password + else + echo "No password set (or empty), generating a new one" + $(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32} > password) + fi +fi + +# private key +if [[ $accountsCount -le 0 ]]; then + echo "No accounts found" + if [[ ! -z $PRIVATE_KEY ]]; then + echo "Creating account from private key" + echo "$PRIVATE_KEY" > ./private_key + XDC account import ./private_key \ + --datadir $DATA_DIR \ + --keystore $KEYSTORE_DIR \ + --password ./password + else + echo "Creating new account" + XDC account new \ + --datadir $DATA_DIR \ + --keystore $KEYSTORE_DIR \ + --password ./password + fi +fi +account=$( + XDC account list --datadir $DATA_DIR --keystore $KEYSTORE_DIR \ + 2> /dev/null \ + | head -n 1 \ + | cut -d"{" -f 2 | cut -d"}" -f 1 +) +echo "Using account $account" +params="$params --unlock $account" + +# bootnodes +if [[ ! -z $BOOTNODES ]]; then + params="$params --bootnodes $BOOTNODES" +fi + +# extip +if [[ ! -z $EXTIP ]]; then + params="$params --nat extip:${EXTIP}" +fi + +# syncmode +if [[ ! -z $SYNC_MODE ]]; then + params="$params --syncmode ${SYNC_MODE}" +fi + +# netstats +if [[ ! -z $WS_SECRET ]]; then + echo "Will report to netstats server ${NETSTATS_HOST}:${NETSTATS_PORT}" + params="$params --ethstats ${IDENTITY}:${WS_SECRET}@${NETSTATS_HOST}:${NETSTATS_PORT}" +else + echo "WS_SECRET not set, will not report to netstats server." +fi + +# dump +echo "dump: $IDENTITY $account $BOOTNODES" + +exec XDC $params \ + --verbosity 4 \ + --datadir $DATA_DIR \ + --keystore $KEYSTORE_DIR \ + --identity $IDENTITY \ + --password ./password \ + --port 30303 \ + --rpc \ + --rpccorsdomain "*" \ + --rpcaddr 0.0.0.0 \ + --rpcport 8545 \ + --rpcvhosts "*" \ + --ws \ + --wsaddr 0.0.0.0 \ + --wsport 8546 \ + --wsorigins "*" \ + --mine \ + --gasprice "1" \ + --targetgaslimit "420000000" \ + "$@" \ No newline at end of file