Python 错误:在Docker中的Alpine上安装psycopg2时,找不到pg_配置可执行文件

Python 错误:在Docker中的Alpine上安装psycopg2时,找不到pg_配置可执行文件,python,postgresql,docker,psycopg2,alpine,Python,Postgresql,Docker,Psycopg2,Alpine,我正在尝试使用Postgres和Docker构建一个Flask应用程序。我想连接到Postgres的AWS RDS实例,但我的Flask应用程序使用Docker。但是,当尝试设置psycopg2时,它会遇到错误,因为它找不到pg\u config。以下是错误: Building api Step 1/5 : FROM python:3.6.3-alpine3.6 ---> 84c98ca3b5c5 Step 2/5 : WORKDIR /usr/src/app ---> Usin

我正在尝试使用Postgres和Docker构建一个Flask应用程序。我想连接到Postgres的AWS RDS实例,但我的Flask应用程序使用Docker。但是,当尝试设置
psycopg2
时,它会遇到错误,因为它找不到
pg\u config
。以下是错误:

Building api
Step 1/5 : FROM python:3.6.3-alpine3.6
 ---> 84c98ca3b5c5
Step 2/5 : WORKDIR /usr/src/app
 ---> Using cache
 ---> 407c158f5ee4
Step 3/5 : COPY . .
 ---> 966df18d329e
Step 4/5 : RUN pip install -r requirements.txt
 ---> Running in 284cc97aeb63
Collecting aniso8601==1.3.0 (from -r requirements.txt (line 1))
  Downloading aniso8601-1.3.0.tar.gz (57kB)
Collecting click==6.7 (from -r requirements.txt (line 2))
  Downloading click-6.7-py2.py3-none-any.whl (71kB)
Collecting Flask==0.12.2 (from -r requirements.txt (line 3))
  Downloading Flask-0.12.2-py2.py3-none-any.whl (83kB)
Collecting Flask-RESTful==0.3.6 (from -r requirements.txt (line 4))
  Downloading Flask_RESTful-0.3.6-py2.py3-none-any.whl
Collecting Flask-SQLAlchemy==2.3.2 (from -r requirements.txt (line 5))
  Downloading Flask_SQLAlchemy-2.3.2-py2.py3-none-any.whl
Collecting itsdangerous==0.24 (from -r requirements.txt (line 6))
  Downloading itsdangerous-0.24.tar.gz (46kB)
Collecting Jinja2==2.9.6 (from -r requirements.txt (line 7))
  Downloading Jinja2-2.9.6-py2.py3-none-any.whl (340kB)
Collecting MarkupSafe==1.0 (from -r requirements.txt (line 8))
  Downloading MarkupSafe-1.0.tar.gz
Collecting psycopg2==2.7.3.1 (from -r requirements.txt (line 9))
  Downloading psycopg2-2.7.3.1.tar.gz (425kB)
    Complete output from command python setup.py egg_info:
    running egg_info
    creating pip-egg-info/psycopg2.egg-info
    writing pip-egg-info/psycopg2.egg-info/PKG-INFO
    writing dependency_links to pip-egg-info/psycopg2.egg-info/dependency_links.txt
    writing top-level names to pip-egg-info/psycopg2.egg-info/top_level.txt
    writing manifest file 'pip-egg-info/psycopg2.egg-info/SOURCES.txt'
    Error: pg_config executable not found.

    Please add the directory containing pg_config to the PATH
    or specify the full executable path with the option:

        python setup.py build_ext --pg-config /path/to/pg_config build ...

    or with the pg_config option in 'setup.cfg'.

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-01lf5grh/psycopg2/
ERROR: Service 'api' failed to build: The command '/bin/sh -c pip install -r requirements.txt' returned a non-zero code: 1
这是我的
Dockerfile

FROM python:3.6.3-alpine3.6

WORKDIR /usr/src/app

COPY . .

RUN pip install -r requirements.txt

CMD ["python", "app.py"]
许多其他人似乎在本地也有类似的问题,但没有一个涉及到使用Docker。这似乎是一个Docker问题,因为我可以设置一个本地虚拟环境,而且设置工作正常,因为我在本地安装了Postgres,它可以找到我的本地
pg\u config

似乎在容器构建/设置过程中,Docker试图在容器中查找
pg_config
。有没有办法在容器中安装
pg_config
,即使我不会使用Postgres的容器化实例,而是使用RDS上的实例


欢迎对如何解决此问题提出任何建议。

使用Python 3.4.8、3.5.5、3.6.5和2.7.14进行测试(只需将3替换为2):


说明:要构建Psycopg,您需要包
gcc musl dev postgresql dev
。然后您还需要pg_config可执行文件:只需安装
postgresql dev
就可以了,
postgresql libs
也很好,占用的空间减少了约12MB


这里是答案的原始版本(基于),我手动将Python安装到纯Alpine映像上,因为当时Python没有为Docker映像提供Python 3.6和Alpine 3.7。如果您希望像那样安装Python2.7,也可以执行
apk add py2 pip
(在旧的Alpine repos中称为
py pip

你可以试试:

pip安装psycopg2二进制文件
在Dockerfile的
requirements.txt
中安装依赖项之前,只需添加这些命令(psycopg2依赖项)

# install psycopg2 dependencies
RUN apk update
RUN apk add postgresql-dev gcc python3-dev musl-dev

来源:

这些示例的可能重复似乎都涉及在本地设置,但不是特别在没有安装Postgres的Docker容器中。Alpine有一个答案(请参阅Docker文件的第一行):您应该能够为Docker提取答案。感谢@KlausD指出这一点。谢谢。我试试看。谢谢。它帮助我解决了python的同样问题:3.6.4-alpine3。7@MikeStoddart我更新了答案,请查看是否有帮助。对于Ubuntu/Debian,请安装
libpq-dev
。请参见此图。
postgresql libs
依赖于
libpq
,因此您可以使用
libpq
代替Alpine 3.10.3:安装postgresql libs并没有解决问题,但使用postgresql dev解决了问题。您仍然需要独立安装postgres二进制文件。一点也不需要。psycopg2二进制文件与Alpine不兼容。
psycopg2二进制文件
软件包旨在让初学者开始使用
Python
PostgreSQL
,而无需满足构建要求。对于生产使用,建议您使用源分发。因此需要使用
psycopg
(不带二进制文件),我在上面的解决方案示例中遇到了
purge
问题。这对我来说是可行的
FROM alpine:3.7

WORKDIR /usr/src/app

COPY requirements.txt .

RUN \
 apk add --no-cache python3 postgresql-libs && \
 apk add --no-cache --virtual .build-deps gcc python3-dev musl-dev postgresql-dev && \
 python3 -m pip install -r requirements.txt --no-cache-dir && \
 apk --purge del .build-deps

COPY . .

CMD ["python3", "app.py"]
# install psycopg2 dependencies
RUN apk update
RUN apk add postgresql-dev gcc python3-dev musl-dev