From 67c95e7bdce87a207e78ed6d926740e0323eaf51 Mon Sep 17 00:00:00 2001 From: XingfenD Date: Mon, 7 Sep 2026 16:48:58 +0800 Subject: [PATCH] fix(deploy): runtime DNS re-resolution via resolv.conf-injected resolver, both runtimes --- deploy/Dockerfile.web | 3 +++ deploy/entrypoint-resolver.sh | 13 +++++++++++++ deploy/nginx.conf | 7 +++++-- 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 deploy/entrypoint-resolver.sh diff --git a/deploy/Dockerfile.web b/deploy/Dockerfile.web index 2b65b38..fb1a13a 100644 --- a/deploy/Dockerfile.web +++ b/deploy/Dockerfile.web @@ -7,4 +7,7 @@ RUN npm run build FROM nginx:1.27-alpine COPY deploy/nginx.conf /etc/nginx/conf.d/default.conf +COPY --chmod=755 deploy/entrypoint-resolver.sh /entrypoint-resolver.sh COPY --from=build /src/dist /usr/share/nginx/html +# entrypoint 先按 /etc/resolv.conf 注入 resolver(Docker/podman 双运行时),再执行继承的 nginx CMD +ENTRYPOINT ["/entrypoint-resolver.sh"] diff --git a/deploy/entrypoint-resolver.sh b/deploy/entrypoint-resolver.sh new file mode 100644 index 0000000..0ca0db1 --- /dev/null +++ b/deploy/entrypoint-resolver.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# 双运行时(Docker/podman)DNS 修复:镜像内 baked 的 resolver 地址无法同时成立 +# (Docker=127.0.0.11,podman aardvark=网络网关,见容器 /etc/resolv.conf)。 +# 启动前取 resolv.conf 首个 nameserver 注入 nginx 配置,保住 spec §11 的 +# 变量式 proxy_pass 运行时重解析(valid=10s,scale/重建后秒级感知新 IP)。 +set -eu +RESOLVER=$(awk '/^nameserver/{print $2; exit}' /etc/resolv.conf 2>/dev/null || true) +[ -n "$RESOLVER" ] || RESOLVER=127.0.0.11 +CONF=/etc/nginx/conf.d/default.conf +sed -i "s#resolver [0-9a-fA-F:.]* valid=#resolver ${RESOLVER} valid=#" "$CONF" +echo "entrypoint-resolver: resolver=${RESOLVER} injected into ${CONF}" +if [ $# -gt 0 ]; then exec "$@"; fi +exec nginx -g 'daemon off;' diff --git a/deploy/nginx.conf b/deploy/nginx.conf index 106fd1c..c0c0ee0 100644 --- a/deploy/nginx.conf +++ b/deploy/nginx.conf @@ -1,10 +1,13 @@ server { listen 80; client_max_body_size 200m; + # 地址为占位默认值(127.0.0.11=Docker 内嵌 DNS);镜像 entrypoint 启动时会按 + # /etc/resolv.conf 的首个 nameserver 重写本行,兼容 podman aardvark-dns。 + resolver 127.0.0.11 valid=10s; location /api/ { - # 静态主机名:启动时经 /etc/resolv.conf 解析(Docker 127.0.0.11 / podman aardvark 均兼容) - proxy_pass http://api:8080; # 无 URI 部分:保留 /api 前缀转发 + set $api_upstream http://api:8080; # 变量式 → 每次按 DNS 解析,scale 后轮询到新副本(spec §11) + proxy_pass $api_upstream; # 无 URI 部分:保留 /api 前缀转发 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;