ci: поднимать ноду через docker cp вместо bind-mount (DinD)
Раннер — docker-in-docker (docker.sock хоста в job-контейнере), поэтому пути bind-mount (-v) резолвятся на ФС хоста: ни mktemp, ни workspace демону не видны → монтировался пустой каталог, nodeos падал с 'genesis file does not exist'. Конфиг теперь кладём в контейнер через docker cp (tar по API, от путей хоста не зависит), config-dir=/mnt/cfg (docker cp не создаёт родителей, а /mnt/dev/config в образе нет). Проверено локально: chain API get_info + SHiP 101 Switching Protocols. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+17
-13
@@ -86,22 +86,26 @@ jobs:
|
||||
- name: Start blockchain node
|
||||
run: |
|
||||
# Раннер self-hosted и персистентный: упавший прогон оставляет контейнер
|
||||
# с фиксированным именем blockchain, и следующий docker run падает с
|
||||
# exit 125 (Conflict, name already in use). Сносим остаток перед стартом.
|
||||
# с фиксированным именем blockchain, и следующий старт падает с exit 125
|
||||
# (Conflict, name already in use). Сносим остаток перед стартом.
|
||||
docker rm -f blockchain 2>/dev/null || true
|
||||
# nodeos на старте генерирует protocol_features/*.json В смонтированный
|
||||
# config-каталог. Если монтировать сам workspace, эти файлы остаются в нём
|
||||
# (untracked, root-owned — checkout --force их не чистит) и на следующем
|
||||
# прогоне ломают узел: 'plugin_config_exception: Incorrect plugin
|
||||
# configuration'. Монтируем pristine-копию во временном каталоге — узел
|
||||
# пишет сгенерированное туда, workspace остаётся чистым.
|
||||
CONFIG_DIR=$(mktemp -d)
|
||||
cp "${GITHUB_WORKSPACE}/packages/parser2/test/integration/node-config/"* "$CONFIG_DIR/"
|
||||
docker run -d --name blockchain \
|
||||
# Конфиг кладём в контейнер через docker cp, а НЕ через bind-mount (-v).
|
||||
# Раннер работает по схеме docker-in-docker (docker.sock хоста проброшен
|
||||
# в job-контейнер), поэтому пути bind-mount резолвятся на ФС ХОСТА, а не
|
||||
# внутри job-контейнера: ни mktemp, ни workspace хостовому демону не видны
|
||||
# → монтируется ПУСТОЙ каталог (nodeos пишет туда protocol_features, но
|
||||
# genesis.json/config.ini отсутствуют → 'genesis file does not exist').
|
||||
# docker cp передаёт файлы tar-стримом по API и от путей хоста не зависит.
|
||||
# /mnt/dev/config в образе нет (его создавал сам mount), а docker cp не
|
||||
# создаёт родительские каталоги — поэтому config-dir = /mnt/cfg (родитель
|
||||
# /mnt существует). protocol_features узел пишет туда же, в свежесозданный
|
||||
# контейнер — никакого мусора между прогонами.
|
||||
docker create --name blockchain \
|
||||
-p 8888:8888 -p 8080:8080 -p 9876:9876 \
|
||||
-v "$CONFIG_DIR:/mnt/dev/config" \
|
||||
dicoop/blockchain:v5.1.0-dev \
|
||||
/bin/bash -c '/usr/local/bin/nodeos -d /mnt/dev/data -p eosio --config-dir /mnt/dev/config --genesis-json /mnt/dev/config/genesis.json --disable-replay-opts'
|
||||
/bin/bash -c 'mkdir -p /mnt/data && exec /usr/local/bin/nodeos -d /mnt/data -p eosio --config-dir /mnt/cfg --genesis-json /mnt/cfg/genesis.json --disable-replay-opts'
|
||||
docker cp "${GITHUB_WORKSPACE}/packages/parser2/test/integration/node-config" blockchain:/mnt/cfg
|
||||
docker start blockchain
|
||||
sleep 3
|
||||
- name: Wait for Chain API
|
||||
run: |
|
||||
|
||||
Reference in New Issue
Block a user