Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error: pg_config executable not found when installing psycopg2 on Alpine in Docker

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 

Here's my Dockerfile:

FROM python:3.6.3-alpine3.6  WORKDIR /usr/src/app  COPY . .  RUN pip install -r requirements.txt  CMD ["python", "app.py"] 

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.

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.

like image 719
hidace Avatar asked Oct 12 '17 14:10

hidace


People also ask

Where is Pg_config Linux?

pg_config is in postgresql-devel ( libpq-dev in Debian/Ubuntu, libpq-devel on Centos/Fedora/Cygwin/Babun.)

What is Pg_config file?

The view pg_config describes the compile-time configuration parameters of the currently installed version of PostgreSQL. It is intended, for example, to be used by software packages that want to interface to PostgreSQL to facilitate finding the required header files and libraries.

Could not find a version that satisfies the requirement Psycopg binary?

Queries related to “could not find a version that satisfies the requirement psycopg2” You may install a binary package by installing 'psycopg2-binary' from PyPI. If you want to install psycopg2 from source, please install the packages required for the build and try again. PyPI 'psycopg2-binary' package instead.

What is psycopg2 binary?

Project description. Psycopg is the most popular PostgreSQL database adapter for the Python programming language. Its main features are the complete implementation of the Python DB API 2.0 specification and the thread safety (several threads can share the same connection).


2 Answers

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"] 
like image 109
Norrius Avatar answered Sep 24 '22 14:09

Norrius


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/

like image 22
Tasawar Hussain Avatar answered Sep 23 '22 14:09

Tasawar Hussain