错误: 在 Docker 的 Alpine 上安装 Psycopg2时未找到 pg_config 可执行文件

我正在尝试使用 Postgres 和 Docker 构建一个 Flask 应用程序。我想连接到 Postgres 的一个 aWS RDS 实例,但是我的 Flask 应用程序使用的是 Docker。但是,当尝试设置 psycopg2时,它会遇到一个错误,因为它找不到 pg_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_config

似乎在容器构建/设置期间,Docker 试图在容器中找到 pg_config。有没有一种方法可以在容器中安装 pg_config,即使我不会使用 Postgres 的容器化实例,而是使用 RDS 上的实例?

我们欢迎任何关于如何避免这种情况的建议。

88257 次浏览

Tested with Python 3.4.8, 3.5.5, 3.6.5 and 2.7.14 (just replace 3 with 2):

# You can use a specific version too, like python:3.6.5-alpine3.7
FROM python:3-alpine


WORKDIR /usr/src/app


COPY requirements.txt .


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


COPY . .


CMD ["python3", "app.py"]

Explanation: to build Psycopg you need the packages gcc musl-dev postgresql-dev. Then you also need that pg_config executable: while simply installing postgresql-dev will work, postgresql-libs does fine too and takes up some 12 MB less space.


Here's the original version of the answer (based on this Dockerfile) where I manually install Python onto a pure Alpine image because at that time Python did not provide the Docker image with Python 3.6 and Alpine 3.7. If you want to install Python 2.7 like that, also do apk add py2-pip (called py-pip in older Alpine repos).

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"]

You could try:

pip install psycopg2-binary

Simply add these commands (psycopg2 dependencies) before installing dependencies from requirements.txt in Dockerfile

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

Source: https://testdriven.io/blog/dockerizing-django-with-postgres-gunicorn-and-nginx/

On Python 3 you just need to do the following:

sudo apt install libpq-dev python3-dev

I solved this by adding the following to my Dockerfile:

RUN apt-get update \
&& apt-get -y install libpq-dev gcc \
&& pip install psycopg2

this will install psycopg2 dependencies.