Как открыть порт в контейнере Docker с помощью sh? - PullRequest
0 голосов
/ 01 июня 2018

У меня частная сеть 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

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Я бы предложил создать собственный образ докера, расширив родительский.
Создайте свой собственный файл Docker

FROM ethereum/client-go:v1.7.3
EXPOSE 5555

Создайте его и создайте новый образ докера

#>docker build -t custom-client-go -t xyz/custom-client-go .

Переместите его в реестр Docker (профиль xyz в docker-hub), используя команду docker push.

#>docker push xyz/custom-client-go

, а затем обновите docker-compose.yml (имя-изображения -> xyz / custom-client-go *).1011 *

0 голосов
/ 01 июня 2018

Я бы предпочел использовать подход, основанный на файлах.Как вы видели, демон docker открывает этот порт, даже если в контейнере нет прослушивателя.

docker-compose.yml:

version: "3"

services:
  eth_miner:
    image: ethereum/client-go:v1.7.3
    ports:
      - "8545:8545"

    volumes:
      - /var/run/geth:/var/run/geth
      - ${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 "Writing file to show DAG is ready "
touch /var/run/geth/ready
echo "... done"

# Trap signals to remove /var/run/geth/ready on exit
trap "rm /var/run/geth/ready TERM; exit $?" TERM
trap "rm /var/run/geth/ready EXIT; exit $?" EXIT

echo "running 'geth $@'"
geth "$@"
...