首页 > 解决方案 > 如何解决在docker中在alpine上运行postgresql时出现libpq.so.5导入错误

问题描述

嗨,我正在尝试使用 SQLAlchemy 和烧瓶在 docker 中的 alpine 中运行 postgresql,但是每当我运行我的应用程序时,我都会收到此错误ImportError: Error loading shared library libpq.so.5: No such file or directory (needed by /usr/local/lib/python3.8/site-packages/psycopg2/_psycopg.cpython-38-x86_64-linux-gnu.so) ,我已经梳理了堆栈溢出以寻求解决方案,但他们似乎都告诉我安装我已经完成的 psycopg2

 FROM python:3.8.1-alpine3.10 AS build

# ENV PYTHONUNBUFFERED 1

WORKDIR /usr/src/app/restful
COPY requirements.txt /usr/src/app/restful
RUN python -m pip install --upgrade pip
RUN apk update && apk upgrade
RUN apk add libffi-dev
#installing dependencies
# dependencies for libpq postgresql-libs postgresql-dev *remove if not
RUN apk add --no-cache --virtual .build-deps gcc libc-dev py-cryptography libpq postgresql-libs postgresql-dev python3-dev musl-dev make openssl-dev gcc
RUN apk update && apk add --no-cache ca-certificates \
    && update-ca-certificates 2>/dev/null || true
RUN apk add build-base python-dev py-pip jpeg-dev zlib-dev
ENV LIBRARY_PATH=/lib:/usr/lib  
WORKDIR /usr/src/app/restful
COPY requirements.txt  /usr/src/app/restful
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN python -m pip install --upgrade pip
RUN pip install -r requirements.txt
RUN pip install gevent

FROM python:3.8.1-alpine3.10
COPY --from=build /usr/local/lib/python3.8/site-packages/ /usr/local/lib/python3.8/site-packages/
RUN mkdir -p /usr/src/app/restful
RUN set -ex && apk --no-cache add sudo
RUN apk --no-cache --update add libffi libressl
RUN apk update && apk add --no-cache supervisor
RUN pip install psycopg2-binary 

标签: postgresqlflasksqlalchemyflask-sqlalchemypsycopg2

解决方案


您似乎在使用分阶段构建Dockerfile,并且您apk add postgresql-libs处于第一阶段。第二FROM阶段是建立在一个简单的python:3.8.1-alpine3.10基础上,而不是建立在你在它上面所做的所有事情上,你只是复制/usr/local/lib/python3.8/site-packages/到第二阶段。您要么需要找到所有这些依赖项的完整路径(这可能非常乏味),要么只在第二阶段安装依赖项。因此,您需要使用FROM build(包括所有其他 apk 依赖)构建您的第二阶段,或者您需要RUN apk add postgresql-libs gcc libc-dev在第二阶段添加。

所以根据你的目的,你可能需要这个:

<...>
RUN pip install -r requirements.txt
RUN pip install gevent

FROM build
RUN mkdir -p /usr/src/app/restful
<...>

或这个:

<...>
RUN set -ex && apk --no-cache add sudo
RUN apk --no-cache --update add libffi libressl postgresql-libs gcc libc-dev
RUN apk update && apk add --no-cache supervisor
<...>

推荐阅读