Explorar el Código

fix(jenkins): gateway docker run 显式注入 GATEWAY_PORT 环境变量

问题:UAT 的 .env.uat 中 GATEWAY_PORT=43333,但 gateway 容器内
uvicorn 实际监听的是 33333(Dockerfile 默认值),导致:
  - 宿主机端口映射: 43333:43333
  - 容器内实际监听: 33333
  - 端口对不上 → Connection refused

原因:
  - Dockerfile 写了 ENV GATEWAY_PORT=33333(默认值,只为 DEV 设计)
  - docker run 没传 -e GATEWAY_PORT 覆盖,所以容器进程沿用 33333
  - pydantic-settings 是环境变量优先于 .env 文件,
    所以 config.py 读出来的 settings.GATEWAY_PORT 也被 33333 覆盖
  - DEV 巧合能跑通是因为 DEV 也用 33333,UAT 改成 43333 就露馅

修复:docker run gateway 时加 -e GATEWAY_PORT=${env.GATEWAY_PORT}
显式覆盖 Dockerfile 默认值,让容器内端口与宿主机映射端口对齐。

Co-authored-by: Cursor <cursoragent@cursor.com>
天空之城 hace 2 semanas
padre
commit
b12c307fa9
Se han modificado 1 ficheros con 5 adiciones y 1 borrados
  1. 5 1
      Jenkinsfile

+ 5 - 1
Jenkinsfile

@@ -129,11 +129,15 @@ pipeline {
               --restart unless-stopped \\
               ${env.IMAGE_CONTRACT}
 
-            # 3) 网关:gateway(唯一对外端口,并用 -e 把下游地址覆盖为容器名)
+            # 3) 网关:gateway(唯一对外端口)
+            #    -e GATEWAY_PORT=... 是关键:必须覆盖 Dockerfile 的默认 33333,
+            #    否则容器内 uvicorn 会监听默认端口,导致与宿主机映射端口对不上
+            #    pydantic-settings 也是环境变量优先于 .env 文件
             docker run -d --name ${env.CONTAINER_NAME_GATEWAY} \\
               --network ${env.DOCKER_NET} \\
               -p ${env.GATEWAY_PORT}:${env.GATEWAY_PORT} \\
               -e APP_ENV=${env.APP_ENV} \\
+              -e GATEWAY_PORT=${env.GATEWAY_PORT} \\
               -e STORE_BASE_URL=http://${env.CONTAINER_NAME_STORE}:8001 \\
               -e CONTRACT_BASE_URL=http://${env.CONTAINER_NAME_CONTRACT}:8002 \\
               -v ${env.LOG_ROOT}/gateway:/app/common/logs/alien_gateway \\