如何解决 libpq.so.5 在 docker 中 alpine 上的 运行 postgresql 导入错误

How to solve libpq.so.5 Import error when running postgresql on alpine in docker

您好,我正在尝试 运行 在 docker 中使用 SQLAlchemy 和 flask 在 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 

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

我通过将 psycopg2 导入更改为 psycopg2-binary 来解决这个问题。