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
相关产品推荐
相关产品推荐

