错误:在 Docker 中的 Alpine 上安装 psycopg2 时找不到 pg_config 可执行文件

Posted

技术标签:

【中文标题】错误:在 Docker 中的 Alpine 上安装 psycopg2 时找不到 pg_config 可执行文件【英文标题】:Error: pg_config executable not found when installing psycopg2 on Alpine in Docker 【发布时间】:2018-03-24 12:45:57 【问题描述】:

我正在尝试使用带有 Docker 的 Postgres 构建一个 Flask 应用程序。我想连接到 Postgres 的 AWS RDS 实例,但将 Docker 用于我的 Flask 应用程序。但是,当尝试设置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 上的实例?

欢迎任何有关如何解决此问题的建议。

【问题讨论】:

pg_config executable not found的可能重复 这些示例似乎都涉及在本地设置,但并非专门在未安装 Postgres 的 Docker 容器中设置。 Alpine 有一个答案(请参阅 Dockerfile 的第一行):***.com/a/44938314/3929826 你应该能够抽象出 Docker 的答案。 感谢@KlausD 指出这一点。欣赏它。会试一试的。 【参考方案1】:

在 Dockerfile 中从 requirements.txt 安装依赖项之前,只需添加这些命令(psycopg2 依赖项)

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

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

【讨论】:

我在上面的解决方案示例中遇到了purge 的问题。这对我有用【参考方案2】:

你可以试试:

pip install psycopg2-binary

【讨论】:

您仍然需要独立安装 postgres 二进制文件。 一点也不。 psycopg2-binary 与 Alpine 不兼容。 psycopg2-binary 包是为初学者准备开始使用PythonPostgreSQL 而无需满足构建要求。 对于生产用途,建议您使用源代码分发。 因此需要使用psycopg(不带二进制文件)【参考方案3】:

使用 Python 3.4.8、3.5.5、3.6.5 和 2.7.14 测试(只需将 3 替换为 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"]

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


这是答案的原始版本(基于this Dockerfile),我在其中手动将 Python 安装到纯 Alpine 映像上,因为当时 Python 没有为 Python 3.6 和 Alpine 3.7 提供 Docker 映像。如果你想像这样安装 Python 2.7,也可以使用 apk add py2-pip(在旧的 Alpine 存储库中称为 py-pip)。

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

【讨论】:

谢谢。它帮助我解决了 python:3.6.4-alpine3.7 的同样问题 @MikeStoddart 我更新了答案,请看看是否有帮助。 对于 Ubuntu/Debian,安装 libpq-dev。看到这个SO answer。 postgresql-libs 依赖于libpq,因此您可以使用libpq 代替pkgs.alpinelinux.org/package/edge/main/x86_64/postgresql-libs Alpine 3.10.3:安装 postgresql-libs 没有解决问题,但使用 postgresql-dev 解决了。

以上是关于错误:在 Docker 中的 Alpine 上安装 psycopg2 时找不到 pg_config 可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Docker 中的 Alpine 上运行 Apache 2?

在 Docker Alpine 上安装 numpy

python:2.7-alpine 在 Docker 中的 psycopg2 安装

如何在 docker 的官方 php-fpm-alpine 镜像上安装 XDebug?

在 Alpine Docker 容器上安装 OpenSSH

docker build 时 alpine 无法安装软件问题的解决