psycopg2 导入错误 SSL_check_private_key: 找不到符号
psycopg2 import error SSL_check_private_key: symbol not found
我正在使用 Docker 和 psycopg2 连接我的 docker-compose 中的另一个数据库服务。但是,我收到 psycopg2 的导入错误:
Python 3.8.2 (default, Feb 29 2020, 17:03:31)
[GCC 9.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.8/site-packages/psycopg2/__init__.py", line 50, in <module>
from psycopg2._psycopg import ( # noqa
ImportError: Error relocating /usr/lib/python3.8/site-packages/psycopg2/_psycopg.cpython-38-x86_64-linux-gnu.so: SSL_check_private_key: symbol not found
这是我的 Docker 文件,我正在尝试将 psycopg2 与:
一起使用
FROM osgeo/gdal:alpine-normal-latest
ENV PYTHONUNBUFFERED 1
RUN apk update && apk add \
--virtual build-deps gcc python-dev musl-dev \
postgresql-dev \
libpq \
python3-dev \
curl \
libffi-dev
ADD . /app
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip3 install --no-cache-dir -r requirements.txt
CMD ["sh", "./entry.sh"]
我使用的 docker 图片似乎有问题。我最终使用了 thinkwhere/gdal-python:3.7-shippable
并且我能够毫无问题地导入 psycopg2。
问题似乎是最近的 alpine 镜像没有自动安装 openssl。我对基于 alpine 的自定义构建 Docker 图像有同样的问题,并通过在 building/installing 我们的 Python 依赖项之前安装 openssl 包来修复它。
我发现缺失的符号应该从libssl.so
加载。此库未加载,因为 psycopg2
未将其声明为依赖项。我们可以使用 LD_PRELOAD
环境变量强制 python 加载它。
在我的例子中,libssl.so
位于 /lib/libssl.so.1.1
,所以我可以使用它作为解决方法:
/sunstrider # LD_PRELOAD=/lib/libssl.so.1.1 python3 manage.py shell
Python 3.8.5 (default, Jul 20 2020, 23:11:29)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import psycopg2
>>>
我正在使用 Docker 和 psycopg2 连接我的 docker-compose 中的另一个数据库服务。但是,我收到 psycopg2 的导入错误:
Python 3.8.2 (default, Feb 29 2020, 17:03:31)
[GCC 9.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.8/site-packages/psycopg2/__init__.py", line 50, in <module>
from psycopg2._psycopg import ( # noqa
ImportError: Error relocating /usr/lib/python3.8/site-packages/psycopg2/_psycopg.cpython-38-x86_64-linux-gnu.so: SSL_check_private_key: symbol not found
这是我的 Docker 文件,我正在尝试将 psycopg2 与:
一起使用FROM osgeo/gdal:alpine-normal-latest
ENV PYTHONUNBUFFERED 1
RUN apk update && apk add \
--virtual build-deps gcc python-dev musl-dev \
postgresql-dev \
libpq \
python3-dev \
curl \
libffi-dev
ADD . /app
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip3 install --no-cache-dir -r requirements.txt
CMD ["sh", "./entry.sh"]
我使用的 docker 图片似乎有问题。我最终使用了 thinkwhere/gdal-python:3.7-shippable
并且我能够毫无问题地导入 psycopg2。
问题似乎是最近的 alpine 镜像没有自动安装 openssl。我对基于 alpine 的自定义构建 Docker 图像有同样的问题,并通过在 building/installing 我们的 Python 依赖项之前安装 openssl 包来修复它。
我发现缺失的符号应该从libssl.so
加载。此库未加载,因为 psycopg2
未将其声明为依赖项。我们可以使用 LD_PRELOAD
环境变量强制 python 加载它。
在我的例子中,libssl.so
位于 /lib/libssl.so.1.1
,所以我可以使用它作为解决方法:
/sunstrider # LD_PRELOAD=/lib/libssl.so.1.1 python3 manage.py shell
Python 3.8.5 (default, Jul 20 2020, 23:11:29)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import psycopg2
>>>