From d1bb4661d14ccff03cbcbe2d566a0f8cd545494a Mon Sep 17 00:00:00 2001 From: nineap Date: Sat, 11 Jul 2026 04:15:16 +0700 Subject: [PATCH] =?UTF-8?q?Fix:=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=20netrunn?= =?UTF-8?q?er-proxy=20=D0=BF=D0=B0=D0=B4=D0=B0=D0=BB=20=D0=B2=20=D1=80?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B0=D1=80=D1=82-=D0=BB=D1=83=D0=BF=20?= =?UTF-8?q?=E2=80=94=20GLIBC=5F2.38=20not=20found?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dockerfile просто копировал бинарник, собранный ОТДЕЛЬНЫМ шагом прямо на CI-раннере (ubuntu-24.04, glibc 2.39), в рантайм-образ debian:bookworm-slim (glibc 2.36) — любой запуск падал: "GLIBC_2.38 not found". Затронуто абсолютно любое развёртывание этого образа, не конкретная нода. Теперь Dockerfile компилирует Rust ВНУТРИ себя, на том же bookworm, что и рантайм (multi-stage + cargo-chef, тот же паттерн, что в netrunner-backend/Dockerfile) — версии glibc гарантированно совпадают независимо от ОС раннера. build.yml больше не собирает бинарник отдельным шагом, только docker build; добавлен registry-кэш слоёв (type=gha требует GitHub Actions Cache, у self-hosted act_runner его нет — см. аналогичный фикс в netrunner-backend этой сессии). Проверено локально: docker build проходит чисто, ./netrunner-proxy --help запускается без ошибок glibc (до фикса — падал сразу). --- .gitea/workflows/build.yml | 22 ++++++++++------------ Dockerfile | 28 +++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 9025e29..e84ef3c 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -1,8 +1,10 @@ # Собирает netrunner-server (release-бинарник) и пушит Docker-образ во # встроенный Container Registry самой Gitea (gitea.netrunner-vpn.com), не -# ghcr.io. Dockerfile сам не компилирует Rust — он просто копирует уже -# готовый target/release/netrunner-server (см. Dockerfile), поэтому cargo -# build идёт отдельным шагом перед docker build, не внутри него. +# ghcr.io. Dockerfile теперь компилирует Rust ВНУТРИ себя (multi-stage, +# см. Dockerfile) — раньше бинарник собирался отдельным шагом прямо на +# CI-раннере (glibc раннера) и просто копировался в рантайм-образ +# (glibc bookworm-slim), рассинхрон версий ронял прод: "GLIBC_2.38 not +# found". Раздельная сборка на раннере убрана — только docker build. # # Нужен секрет GT_REGISTRY_TOKEN — токен Gitea с правом write:package, # тот же, что и в netrunner-backend/netrunner-landing (пакеты в Gitea @@ -22,15 +24,6 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable - - - name: Cache cargo - uses: Swatinem/rust-cache@v2 - - - name: Build release binary - run: cargo build --release -p netrunner-server - - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -48,3 +41,8 @@ jobs: file: ./Dockerfile push: true tags: gitea.netrunner-vpn.com/nineap/netrunner-proxy:latest + # type=gha требует GitHub Actions Cache — self-hosted act_runner его + # не реализует (см. аналогичный фикс в netrunner-backend/build.yml + # этой же сессии); type=registry работает везде без спецсервиса. + cache-from: type=registry,ref=gitea.netrunner-vpn.com/nineap/netrunner-proxy:cache + cache-to: type=registry,ref=gitea.netrunner-vpn.com/nineap/netrunner-proxy:cache,mode=max diff --git a/Dockerfile b/Dockerfile index e54b76a..146efde 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,34 @@ -# Минимальный чистый образ рантайма +# syntax=docker/dockerfile:1.7 + +# Раньше этот Dockerfile просто копировал уже собранный на CI-раннере +# бинарник (target/release/netrunner-server) в debian:bookworm-slim — а +# раннер (ubuntu-24.04, glibc 2.39) собирал его с более новым glibc, чем +# несёт bookworm-slim (glibc 2.36). В рантайме это падало циклом рестартов: +# "GLIBC_2.38 not found". Компилируем внутри контейнера на той же базе +# (bookworm), что и рантайм — версии glibc гарантированно совпадают, +# независимо от того, какая ОС у раннера CI (см. тот же паттерн в +# netrunner-backend/Dockerfile). +FROM rust:1-bookworm AS chef +RUN cargo install cargo-chef --locked +WORKDIR /app + +FROM chef AS planner +COPY . . +RUN cargo chef prepare --recipe-path recipe.json + +FROM chef AS builder +COPY --from=planner /app/recipe.json recipe.json +RUN cargo chef cook --release --recipe-path recipe.json -p netrunner-server +COPY . . +RUN cargo build --release -p netrunner-server + FROM debian:bookworm-slim WORKDIR /app # Ставим системные сертификаты, чтобы прокси мог работать с сетью по HTTPS RUN apt-get update && apt-get install -y ca-certificates libssl3 && rm -rf /var/lib/apt/lists/* -# Просто копируем уже скомпилированный тобой локально бинарник из wsl-папки target -COPY target/release/netrunner-server /app/netrunner-proxy +COPY --from=builder /app/target/release/netrunner-server /app/netrunner-proxy EXPOSE 443/udp EXPOSE 443/tcp