Как получить geth init и начать майнинг geth с помощью Docker-compose?

Я хочу создать частную сеть Ethereum с помощью Docker. Я подготовил файл генезиса, поэтому мне нужно geth init genesis.json, а затем начать добычу, как geth --mine .... Я могу сделать это с помощью скриптов (например, здесь: https://github.com/vertigobr/ethereum/blob/master/runminer.sh#L5 и https://github.com/vertigobr/ethereum/blob/master/runnode.sh#L23):

if [ ! -d $DATA_ROOT/keystore ]; then
    echo "$DATA_ROOT/keystore not found, running 'geth init'..."
    docker run --rm \
        -v $DATA_ROOT:/root/.ethereum \
        -v $(pwd)/genesis.json:/opt/genesis.json \
        $IMGNAME init /opt/genesis.json
    echo "...done!"
fi
echo "Running new container $CONTAINER_NAME..."
docker run $DETACH_FLAG --name $CONTAINER_NAME \
    --network ethereum \
    -v $DATA_ROOT:/root/.ethereum \
    -v $DATA_HASH:/root/.ethash \
    -v $(pwd)/genesis.json:/opt/genesis.json \
    $RPC_PORTMAP \
    $IMGNAME --bootnodes=$BOOTNODE_URL $RPC_ARG --cache=512 --verbosity=4 --maxpeers=3 ${@:2}

Поскольку это кажется двухэтапным процессом, как я могу сделать это с помощью Docker-compose?

Что мне писать, если я отменяю command: для службы майнинга? Если я напишу просто geth init, то майнинг не начнется. Если я попробую присоединиться и напишу command: init genesis.json --mine ..., будет больно:

version: "3"

services:
  eth_miner:
    image: ethereum/client-go:v1.7.3
    ports:
      - "8545:8545"
    volumes:
      - ${DATA_ROOT}:/root/.ethereum
      - ${GENESIS_FILE}:/opt/genesis.json
    command: init /opt/genesis.json --rpc --rpcaddr=0.0.0.0 --rpcapi=db,eth,net,web3,personal --rpccorsdomain "*" --nodiscover --cache=512 --verbosity=4 --mine --minerthreads=3 --networkid 15 --etherbase="${ETHERBASE}" --gasprice=${GASPRICE}

бревно:

Attaching to 7adbb760_eth_miner_1
eth_miner_1  | Incorrect Usage: flag provided but not defined: -rpc
eth_miner_1  | 
eth_miner_1  | init [command options] [arguments...]
eth_miner_1  | 
eth_miner_1  | The init command initializes a new genesis block and definition for the network.
eth_miner_1  | This is a destructive action and changes the network in which you will be
eth_miner_1  | participating.
eth_miner_1  | 
eth_miner_1  | It expects the genesis file as argument.
eth_miner_1  | 
eth_miner_1  | ETHEREUM OPTIONS:
eth_miner_1  |   --datadir "/root/.ethereum"  Data directory for the databases and keystore
eth_miner_1  | 
eth_miner_1  | DEPRECATED OPTIONS:
eth_miner_1  |   --light  Enable light client mode
eth_miner_1  | 
eth_miner_1  | flag provided but not defined: -rpc
7adbb760_eth_miner_1 exited with code 1

person 4ntoine    schedule 30.05.2018    source источник


Ответы (1)


Лучшим вариантом является создание сценария оболочки, который выполняет инициализацию, а затем запускает geth, должно быть примерно так:

#!/bin/bash
if [ ! -d /root/.ethereum/keystore ]; then
    echo "/root/.ethereum/keystore not found, running 'geth init'..."
    geth init /opt/genesis.json
    echo "...done!"
fi

geth "$@"

И docker-compose.yaml:

version: "3"

services:
  eth_miner:
    image: ethereum/client-go:v1.7.3
    ports:
      - "8545:8545"
    volumes:
      - ${DATA_ROOT}:/root/.ethereum
      - ${GENESIS_FILE}:/opt/genesis.json
      - ./init-script.sh:/root/init-script.sh
    entrypoint: /root/init-script.sh
    command: --bootnodes=$BOOTNODE_URL $RPC_ARG --cache=512 --verbosity=4 --maxpeers=3 ${@:2}
person Ignacio Millán    schedule 30.05.2018
comment
Команда option в docker-compose.yml просто передает /root/init-script.sh --bootnodes = ... в docker-entrypoint.sh в качестве аргумента. Боюсь, точка входа может быть geth. Если это так, то он не будет работать (если мы не сможем также переопределить точку входа cmd). - person 4ntoine; 30.05.2018
comment
Моя ошибка, только что отредактировал ответ. Я забыл изменить точку входа. - person Ignacio Millán; 30.05.2018
comment
спасибо за редактирование, я проверил, что точка входа действительно geth, поэтому нам тоже нужно переопределить ее. - person 4ntoine; 30.05.2018
comment
Я считаю, что в общем случае запуск такого сценария может решить проблему. в этом конкретном случае я получаю отказ в разрешении как для /root/init-script.sh, так и для /opt/init-script.sh - person 4ntoine; 30.05.2018
comment
Запустите chmod + x init-script.sh - person Ignacio Millán; 30.05.2018
comment
некоторые необходимые изменения: entrypoint: sh /root/init-script.sh и / или #!/bin/sh в скрипте - person 4ntoine; 30.05.2018