Docker容器部署含PIConnect代码时遇PIAF SDK未找到错误求助
问题:PIConnect容器化运行时提示PIAF SDK未找到
问题描述
用户提供的Dockerfile如下:
ARG PYTHON_VERSION=3.10.11 FROM python:${PYTHON_VERSION}-slim as base RUN pip install piaf RUN apt-get update && \ apt-get install -y mono-complete ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 WORKDIR /app ARG UID=10001 RUN adduser \ --disabled-password \ --gecos "" \ --home "/nonexistent" \ --shell "/sbin/nologin" \ --no-create-home \ --uid "${UID}" \ appuser RUN pip install PIConnect RUN pip install pythonnet RUN --mount=type=cache,target=/root/.cache/pip \ --mount=type=bind,source=requirements.txt,target=requirements.txt \ python -m pip install -r requirements.txt ENV PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.10/site-packages/PIAF_SDK:$PWD USER appuser COPY . . EXPOSE 8000 RUN mono --version CMD ["python", "main.py", "--data_dir2", "/container/path2"]
容器运行时出现以下错误:
/usr/local/lib/python3.10/site-packages/clr_loader/mono.py:180: UserWarning: Hosting Mono versions before v6.12 is known to be problematic. If the process crashes shortly after you see this message, try updating Mono to at least v6.12. warnings.warn( Traceback (most recent call last): File "/app/main.py", line 18, in <module> import PIconnect as PI File "/usr/local/lib/python3.10/site-packages/PIconnect/__init__.py", line 5, in <module> from PIconnect.AFSDK import AF, AF_SDK_VERSION File "/usr/local/lib/python3.10/site-packages/PIconnect/AFSDK.py", line 54, in <module> raise ImportError("PIAF SDK not found, check installation") ImportError: PIAF SDK not found, check installation
问题原因
- Mono版本过低:警告明确指出低于v6.12的Mono版本存在兼容性问题,会影响PIAF SDK的加载逻辑。
- PIAF SDK未正确部署:
pip install piaf仅安装了Python封装层,而PIConnect依赖的核心是OSIsoft官方的AF SDK(.NET DLL库),该库无法通过pip直接获取,必须手动部署到容器中。 - PYTHONPATH配置无效:设置的路径
/usr/local/lib/python3.10/site-packages/PIAF_SDK下没有实际的AF SDK文件,配置形同虚设。
解决方案
1. 升级Mono版本
替换Dockerfile中安装mono的命令,添加Mono官方源安装指定高版本:
RUN apt-get update && apt-get install -y apt-transport-https dirmngr gnupg ca-certificates RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF RUN echo "deb https://download.mono-project.com/repo/debian stable-bullseye main" | tee /etc/apt/sources.list.d/mono-official-stable.list RUN apt-get update && apt-get install -y mono-complete=6.12.0.182-0xamarin1+debian11b1
2. 手动部署AF SDK文件
从OSIsoft官方渠道获取AF SDK安装包,提取其中的核心DLL文件(如OSIsoft.AFSDK.dll等),将这些文件复制到容器中并配置Mono加载路径:
# 假设本地AF SDK DLL存放在./af-sdk目录 ENV MONO_PATH=/usr/local/lib/af-sdk:$MONO_PATH COPY ./af-sdk/ /usr/local/lib/af-sdk/
3. 调整运行时环境变量
添加pythonnet所需的.NET运行时配置:
ENV CLR_RUNTIME=mono ENV CLR_VERSION=v4.0.30319
修正后的Dockerfile示例
ARG PYTHON_VERSION=3.10.11 FROM python:${PYTHON_VERSION}-slim as base # 安装高版本Mono RUN apt-get update && apt-get install -y apt-transport-https dirmngr gnupg ca-certificates RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF RUN echo "deb https://download.mono-project.com/repo/debian stable-bullseye main" | tee /etc/apt/sources.list.d/mono-official-stable.list RUN apt-get update && apt-get install -y mono-complete=6.12.0.182-0xamarin1+debian11b1 # 环境变量配置 ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 ENV CLR_RUNTIME=mono ENV CLR_VERSION=v4.0.30319 ENV MONO_PATH=/usr/local/lib/af-sdk:$MONO_PATH WORKDIR /app # 创建非特权用户 ARG UID=10001 RUN adduser \ --disabled-password \ --gecos "" \ --home "/nonexistent" \ --shell "/sbin/nologin" \ --no-create-home \ --uid "${UID}" \ appuser # 安装Python依赖 RUN pip install PIConnect pythonnet RUN --mount=type=cache,target=/root/.cache/pip \ --mount=type=bind,source=requirements.txt,target=requirements.txt \ python -m pip install -r requirements.txt # 复制AF SDK DLL到容器 COPY ./af-sdk/ /usr/local/lib/af-sdk/ USER appuser COPY . . EXPOSE 8000 RUN mono --version CMD ["python", "main.py", "--data_dir2", "/container/path2"]
是否可以将PIConnect SDK集成到容器中?
可以,但需要注意:
- 必须合法获取OSIsoft AF SDK,遵守其许可协议。
- 容器内需正确配置Mono和.NET运行时,确保AF SDK的DLL能被pythonnet正常加载。
- 严格匹配版本兼容性:Mono版本不低于v6.12,Python版本需与PIConnect、pythonnet版本适配。
内容的提问来源于stack exchange,提问作者Raj Rajeshwari Prasad
相关产品推荐
相关产品推荐

