You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器中使用Zeep调用SOAP API时请求执行失败求助

问题排查与解决方案:Docker部署Zeep+FastAPI调用SOAP API容器崩溃

1. 强制捕获所有错误日志

容器无预警停止且无日志,核心是先拿到崩溃原因。在接口逻辑中添加全局异常捕获,打印完整栈追踪:

import traceback
from fastapi import FastAPI, HTTPException
# 其余导入保留

@app.get("/")
def read_root():
    try:
        # 原请求构造、客户端初始化逻辑
        request = {
            'SolicitudDatosLocalizacion':{
                'TipoIdentificacion': '1',
                'Identificacion': 'xxxxxxxxx',
                'PrimerApellido': 'XXXXXXXX',
                'Usuario': 'xxxxxxxxxx',
                'Clave': 'xxxxx',
            }
        }
        session = RequestSession()
        session.cert = "service_public_key.pem"
        transport_certificate = Transport(session=session)
        signature_config = Signature(key_file="service_private_key.key", certfile="c55.crt")
        user_name_token = UsernameToken('x-xxxxxxx.x', 'xxx-xx--xx')
        client = Client(
            'https://demo-servicesesb.datacredito.com.co:443/wss/localizacion/services/ServicioLocalizacion?wsdl', 
            wsse = CustomSignature([user_name_token, signature_config]), 
            transport = transport_certificate
        )
        service = client.bind('ServicioLocalizacion', 'ServicioLocalizacionPort.dmz.https')
        response = service.consultarDatosLocalizacion(request)
        print(response)
        return {"Hello": "World"}
    except Exception as e:
        traceback.print_exc()
        raise HTTPException(status_code=500, detail=str(e))

同时在Dockerfile中添加环境变量确保日志实时输出:

ENV PYTHONUNBUFFERED=1

启动容器后用docker logs -f <容器ID>查看完整错误信息。

2. 验证证书文件的路径与权限

  • 确保Dockerfile中已将所有证书文件复制到容器内的工作目录:
COPY service_public_key.pem /app/
COPY service_private_key.key /app/
COPY c55.crt /app/
  • 给证书文件设置可读权限(避免容器运行用户无权限读取):
RUN chmod 644 /app/service_public_key.pem /app/service_private_key.key /app/c55.crt

3. 补充系统级依赖

Zeep的签名功能依赖xmlsec,而该库需要系统级底层支持。如果使用slim或alpine镜像,需手动安装依赖:

  • Debian/Ubuntu系镜像:
RUN apt-get update && apt-get install -y --no-install-recommends \
    libxmlsec1 \
    libxmlsec1-openssl \
    && rm -rf /var/lib/apt/lists/*
  • Alpine镜像:
RUN apk add --no-cache xmlsec xmlsec-dev

4. 对齐Python与依赖版本

  • 容器中使用与本地一致的Python 3.11版本,避免版本差异导致的兼容性问题。
  • 导出本地测试通过的依赖版本到requirements.txt,容器中严格安装该版本:
fastapi==<本地版本>
zeep==<本地版本>
requests==<本地版本>
xmlsec==<本地版本>
uvicorn==<本地版本>

5. 排查网络与SSL证书信任问题

容器内可能无法验证目标SOAP API的SSL证书,可临时关闭验证排查(生产环境禁用):

session.verify = False

若关闭后正常运行,说明容器缺少目标API的CA证书,需将对应CA证书复制到容器信任目录,或在session.verify中指定CA证书路径。

6. 检查CustomSignature实现

代码中使用的CustomSignature未提供实现,需确保该类:

  • 已正确复制到容器中
  • 继承自Zeep的WSSE基类,签名逻辑无错误
  • 未依赖本地存在但容器缺失的库或资源

内容的提问来源于stack exchange,提问作者David Castro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 08:38:12