From 968603c720db69a18a528621afeddabe90f96731 Mon Sep 17 00:00:00 2001 From: satwise Date: Tue, 22 Sep 2026 13:08:30 -0400 Subject: [PATCH] Fix early lightningd exit handling --- .github/workflows/docker.yml | 3 ++ docker-entrypoint.sh | 16 +++++++- tests/docker-entrypoint-test.sh | 71 +++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 tests/docker-entrypoint-test.sh diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 828c26f..d221401 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -31,6 +31,9 @@ jobs: - name: Check out repository uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - name: Test entrypoint lifecycle + run: bash tests/docker-entrypoint-test.sh + - name: Validate versions shell: bash run: | diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 35cef28..8691e80 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -13,8 +13,20 @@ LIGHTNINGD_PID=$! trap 'kill -TERM "$LIGHTNINGD_PID" 2>/dev/null' TERM INT echo "Core-Lightning starting" -while read -r i; do if [ "$i" = "lightning-rpc" ]; then break; fi; done \ - < <(inotifywait -e create,open --format '%f' --quiet "${networkdatadir}" --monitor) +while [[ ! -e "${networkdatadir}/lightning-rpc" ]]; do + if ! kill -0 "$LIGHTNINGD_PID" 2>/dev/null; then + wait "$LIGHTNINGD_PID" + status=$? + trap - TERM INT + exit "$status" + fi + + if [[ -d "${networkdatadir}" ]]; then + inotifywait -e create,open --quiet --timeout 1 "${networkdatadir}" >/dev/null 2>&1 || true + else + sleep 1 + fi +done if [ "$EXPOSE_TCP" == "true" ]; then echo "Core-Lightning started, RPC available on port $LIGHTNINGD_RPC_PORT" diff --git a/tests/docker-entrypoint-test.sh b/tests/docker-entrypoint-test.sh new file mode 100644 index 0000000..9d507f7 --- /dev/null +++ b/tests/docker-entrypoint-test.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +set -euo pipefail + +repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +test_dir="$(mktemp -d)" +trap 'rm -rf "$test_dir"' EXIT + +mkdir -p "$test_dir/bin" + +cat >"$test_dir/bin/lightningd" <<'EOF' +#!/usr/bin/env bash + +case "$TEST_LIGHTNINGD_MODE" in + fail) + sleep 0.1 + exit 42 + ;; + ready) + sleep 0.1 + touch "$LIGHTNINGD_DATA/$LIGHTNINGD_NETWORK/lightning-rpc" + sleep 0.1 + ;; +esac +EOF + +cat >"$test_dir/bin/inotifywait" <<'EOF' +#!/usr/bin/env bash +sleep 0.05 +exit 2 +EOF + +chmod +x "$test_dir/bin/lightningd" "$test_dir/bin/inotifywait" + +failure_data="$test_dir/failure" +mkdir -p "$failure_data/bitcoin" + +set +e +PATH="$test_dir/bin:$PATH" \ + LIGHTNINGD_DATA="$failure_data" \ + LIGHTNINGD_NETWORK="bitcoin" \ + TEST_LIGHTNINGD_MODE="fail" \ + timeout 3 bash "$repo_dir/docker-entrypoint.sh" >/dev/null 2>&1 +failure_status=$? +set -e + +if [[ "$failure_status" -ne 42 ]]; then + echo "expected early lightningd failure status 42, got $failure_status" >&2 + exit 1 +fi + +ready_data="$test_dir/ready" +mkdir -p "$ready_data/bitcoin" "$ready_data/lightning-poststart.d" +cat >"$ready_data/lightning-poststart.d/verify" </dev/null 2>&1 + +if [[ ! -f "$test_dir/poststart-ran" ]]; then + echo "expected post-start hook to run after RPC became available" >&2 + exit 1 +fi + +echo "docker-entrypoint tests passed" \ No newline at end of file