错误:在Docker的Alpine上安装psycopg2时找不到pg_config可执行文件
我正在尝试使用Postgres和Docker构建Flask应用。我想连接到Postgres的AWS RDS实例,但是将Docker用于我的Flask应用程序。但是,当尝试设置 psycopg2
时,由于找不到 pg_config
而遇到错误。错误如下:
I'm trying to build a Flask app using Postgres with Docker. I'd like to connect to an AWS RDS instance of Postgres, but use Docker for my Flask app. However, when trying to set up psycopg2
it runs into an error because it can't find pg_config
. Here's the error:
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
。
Many others seem to have a similar issue locally, but none of them involve using Docker. This seems like a Docker issue because I can set up a local virtual environment and the setup works just fine since I have Postgres installed locally and it's able to find my local pg_config
.
看来,在容器构建/设置过程中,Docker试图在容器中找到 pg_config
。即使我不会使用Postgres的容器化实例,而是RDS上的实例,是否可以在容器中安装 pg_config
?
It appears that during the container build/setup, Docker is trying to find pg_config
within the container. Is there a way to install a pg_config
in the container, even though I won't be using a containerized instance of Postgres, but rather the instance on RDS?
欢迎您提出任何有关如何解决此问题的建议。谢谢!
Any and all suggestions on how to get around this are welcomed. Thanks!
经过Python 3.4.8、3.5.5、3.6.5和2.7.14的测试(只需将3替换为2):
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"]
说明:要构建Psycopg,您需要软件包 gcc musl-dev postgresql-dev
。然后,您还需要pg_config可执行文件:虽然只需安装 postgresql-dev
即可,但 postgresql-libs
也可以,并且占用的空间减少了约12 MB。
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.
这是答案的原始版本(基于此Dockerfile ),在此我手动将Python安装到纯Alpine映像上,因为那时Python确实做了没有为Python 3.6和Alpine 3.7提供Docker映像。如果您想像这样安装Python 2.7,也可以在 apk中添加py2-pip
(在较早的版本中称为 py-pip
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"]