82 votes

Erreur: exécutable pg_config introuvable lors de l'installation de psycopg2 sur Alpine dans Docker

Je suis en train de construire un Flacon d'application à l'aide de Postgres avec Docker. Je tiens à vous connecter à une AWS RDS instance de Postgres, mais l'utilisation de Docker pour ma Gourde d'application. Toutefois, lorsque vous essayez de configurer psycopg2 il s'agit d'une erreur car il ne peut pas trouver pg_config. Voici l'erreur:

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

Voici mon Dockerfile:

FROM python:3.6.3-alpine3.6

WORKDIR /usr/src/app

COPY . .

RUN pip install -r requirements.txt

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

Beaucoup d'autres semblent avoir un problème similaire au niveau local, mais aucun d'entre eux comportent l'utilisation de Docker. Cela semble comme un Docker question parce que je peux mettre en place un local virtuel de l'environnement et de la configuration fonctionne très bien depuis que j'ai installé Postgres localement et il est capable de trouver mon local pg_config.

Il semble que pendant le conteneur de construction et d'installation, Docker est en essayant de trouver pg_config dans le conteneur. Est-il possible d'installer un pg_config dans le conteneur, même si je ne vais pas utiliser un conteneur instance de Postgres, mais plutôt l'instance sur RDS?

Toutes les suggestions sur la façon de contourner ce sont les bienvenus. Merci!

144voto

Norrius Points 2592

Testé avec Python 3.4.8, 3.5.5, 3.6.5 et 2.7.14 (il suffit de remplacer 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"]

Explication: pour construire Psycopg vous avez besoin de les packages gcc musl-dev postgresql-dev. Alors vous aussi besoin que pg_config exécutable: tout simplement en installant postgresql-dev travail, postgresql-libs t trop belle et prend environ 12 MO de moins d'espace.


Voici la version originale de la réponse (basé sur cette Dockerfile) où j'ai manuellement installer Python sur un pur des alpes de l'image, car à l'époque Python n'a pas de fournir le Support de l'image avec Python 3.6 et Alpin 3.7. Si vous souhaitez installer Python 2.7 comme ça, aussi dois - apk add py2-pip (appelés py-pip chez les plus âgés Alpin 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"]

6voto

Vivin Veerali Points 67

Tu pourrais essayer:

 pip install psycopg2-binary
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X