У меня частная сеть Ethereum, работающая в контейнере Docker.Так как я на PoW, мне нужно сгенерировать DAG, и это займет около 10 минут.Мне нужно дать сигнал хосту, что он как-то закончен, поэтому я решил открыть порт 5555. Поэтому в моем скрипте инициализации я пытаюсь это сделать:
docker-compose.yml:
version: "3"
services:
eth_miner:
image: ethereum/client-go:v1.7.3
ports:
- "8545:8545"
- "5555:5555" # required?
volumes:
- ${DATA_DIR}:/root/.ethereum
- ${HASH_DIR}:/root/.ethash
- ${GENESIS_FILE}:/opt/genesis.json
- ${INIT_FILE}:/opt/init-script.sh
entrypoint: sh /opt/init-script.sh
command: --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}
init-script.sh:
#!/bin/sh
# check for genesis file
if [ ! -f /root/.ethereum/.init ]; then
echo "running 'geth init /opt/genesis.json' ..."
geth init /opt/genesis.json
touch /root/.ethereum/.init
echo "... done"
fi
# check for DAG generated
if [ ! -f /root/.ethash/full-R23-0000000000000000 ]; then
echo "running 'geth makedag 10000 /root/.ethash' ..."
geth makedag 10000 /root/.ethash
echo "... done"
fi
echo "opening port 5555 to show DAG is ready "
nc -l 5555 &
echo "... done"
echo "running 'geth $@'"
geth "$@"
Если я оставлю отображение 5555:5555
в docker-compose.yml
, то оно открывается сразу после запуска и не может работать как сигнал:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
808a5453bf57 ethereum/client-go:v1.7.3 "sh /opt/init-script…" 4 seconds ago Up 11 seconds 0.0.0.0:5555->5555/tcp, 8546/tcp, 0.0.0.0:8545->8545/tcp, 30303/tcp, 30303-30304/udp 7f8680be_eth_miner_1
, даже если он не открыт (зарегистрирован в контейнер докера):
/ # netstat -lntu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.11:39593 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:42033 0.0.0.0:* LISTEN
tcp 0 0 :::30303 :::* LISTEN
tcp 0 0 :::8545 :::* LISTEN
udp 0 0 127.0.0.11:56580 0.0.0.0:*
Если я удалю его из docker-compose.yml
, тогда я, очевидно, не смогу получить к нему доступ в тесте:
java.lang.IllegalArgumentException: No internal port '5555' for container 'eth_miner': Suppliers.memoize(com.palantir.docker.compose.connection.Container$$Lambda$46/1692550316@5ac2447d)
Так возможно ли использовать этот подход?
ОБНОВЛЕНИЕ: если это имеет смысл 'ethereum / client-go' Образ Docker основан на golang:1.10-alpine as builder
image