Switch to bridge networking with fixed container port 80 and served name llm

- run.sh: bridge + -p ${HOST_PORT:-24396}:80, health check uses host port
- entrypoint.sh: PORT defaults to 80, SERVED_NAME defaults to llm
  detected port/served name become log hints only
- verify.sh: read host port from port bindings, expect model name llm
- docker-compose.yml: ports mapping instead of network_mode host
- README: update tables, commands and rationale
This commit is contained in:
2026-10-28 14:19:42 +08:00
parent 31994d940f
commit daaf85f4e5
5 changed files with 120 additions and 57 deletions

View File

@@ -21,7 +21,7 @@ cd "$(dirname "$0")"
MODEL_DIR="${MODEL_HOST_DIR:-}"
CONTAINER="${CONTAINER:-}"
PORT="${PORT:-}"
PORT="${PORT:-${HOST_PORT:-}}"
SERVED_NAME="${SERVED_NAME:-}"
BASE_URL="${BASE_URL:-}"
TIMEOUT="${TIMEOUT:-180}"
@@ -101,7 +101,21 @@ for m in mounts:
break
' || true)"
fi
[[ -z "${PORT}" ]] && PORT="$(container_env "${CONTAINER}" PORT)"
# 宿主端口来自端口映射(-p),不是容器内的 PORT(现在恒为 80)
if [[ -z "${PORT}" ]]; then
PORT="$(docker inspect "${CONTAINER}" --format '{{json .HostConfig.PortBindings}}' 2>/dev/null \
| python3 -c '
import json, sys
try:
binds = json.load(sys.stdin) or {}
except Exception:
sys.exit(0)
for container_port, mapping in binds.items():
if mapping:
print(mapping[0].get("HostPort", ""))
break
' || true)"
fi
[[ -z "${SERVED_NAME}" ]] && SERVED_NAME="$(container_env "${CONTAINER}" SERVED_NAME)"
fi
@@ -111,7 +125,7 @@ MAVERICK_DEFAULT="/mnt/disk0/models/LLM-Research/Llama-4-Maverick-17B-128E-Instr
# 没有 docker 时(例如在 ugly_hopper 内运行),按端口探测正在运行的服务。
if [[ -z "${CONTAINER}" && -z "${PORT}" && -z "${MODEL_DIR}" && -z "${BASE_URL}" ]]; then
for candidate_port in 8091 8092; do
for candidate_port in 24396 8091 8092; do
if curl -fsS --max-time 2 "http://127.0.0.1:${candidate_port}/health" >/dev/null 2>&1; then
PORT="${candidate_port}"
break
@@ -119,8 +133,9 @@ if [[ -z "${CONTAINER}" && -z "${PORT}" && -z "${MODEL_DIR}" && -z "${BASE_URL}"
done
fi
# 从 served name 反推模型目录(方便 --base-url + --served-name 的用法)。
if [[ -z "${MODEL_DIR}" && -n "${SERVED_NAME}" ]]; then
# 模型名现在恒为 llm(AGENTS.md 5.5),不能再靠它反推变体。
# 兼容旧用法:如果显式传了带变体的 served name,仍然尝试反推目录。
if [[ -z "${MODEL_DIR}" && -n "${SERVED_NAME}" && "${SERVED_NAME}" != "llm" ]]; then
case "${SERVED_NAME}" in
*maverick*)
if [[ -f "${MAVERICK_DEFAULT}/config.json" ]]; then
@@ -135,10 +150,9 @@ if [[ -z "${MODEL_DIR}" && -n "${SERVED_NAME}" ]]; then
esac
fi
# 端口也不再区分变体(宿主端口默认统一 24396),只按目录存在性取默认值。
if [[ -z "${MODEL_DIR}" && -z "${BASE_URL}" ]]; then
if [[ "${PORT}" == "8092" && -f "${MAVERICK_DEFAULT}/config.json" ]]; then
MODEL_DIR="${MAVERICK_DEFAULT}"
elif [[ -f "${SCOUT_DEFAULT}/config.json" ]]; then
if [[ -f "${SCOUT_DEFAULT}/config.json" ]]; then
MODEL_DIR="${SCOUT_DEFAULT}"
elif [[ -f "${MAVERICK_DEFAULT}/config.json" ]]; then
MODEL_DIR="${MAVERICK_DEFAULT}"
@@ -163,13 +177,13 @@ fi
if [[ -n "${DETECT_JSON}" ]]; then
KIND="$(python3 -c 'import json,sys; print(json.load(sys.stdin)["kind"])' <<< "${DETECT_JSON}")"
DETECTED_PORT="$(python3 -c 'import json,sys; print(json.load(sys.stdin)["port"])' <<< "${DETECT_JSON}")"
DETECTED_NAME="$(python3 -c 'import json,sys; print(json.load(sys.stdin)["served_name"])' <<< "${DETECT_JSON}")"
[[ -z "${PORT}" ]] && PORT="${DETECTED_PORT}"
[[ -z "${SERVED_NAME}" ]] && SERVED_NAME="${DETECTED_NAME}"
# DETECTED_PORT / served_name 只是变体信息,不作为实际端口和模型名:
# 容器内恒 80,宿主端口默认 24396,模型名恒 llm(AGENTS.md 5.2 / 5.4 / 5.5)。
DETECTED_HOST_PORT_HINT="${DETECTED_PORT:-}"
fi
PORT="${PORT:-8091}"
SERVED_NAME="${SERVED_NAME:-llama4}"
PORT="${PORT:-24396}"
SERVED_NAME="${SERVED_NAME:-llm}"
BASE_URL="${BASE_URL:-http://127.0.0.1:${PORT}}"
BASE_URL="${BASE_URL%/}"