I’m trying to deploy a Flask app, but the dependency install step is failing:
Downloading psycopg2-2.9.3.tar.gz (380 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 380.6/380.6 kB 75.0 MB/s eta 0:00:00
Preparing metadata (setup.py): started
Preparing metadata (setup.py): finished with status 'error'
× python setup.py egg_info did not run successfully.
│ exit code: 1
╰─> [25 lines of output]
/layers/paketo-buildpacks_cpython/cpython/lib/python3.10/site-packages/setuptools/config/setupcfg.py:463: SetuptoolsDeprecationWarning: The license_file parameter is deprecated, use license_files instead.
writing dependency_links to /tmp/pip-pip-egg-info-ydcnhb7u/psycopg2.egg-info/dependency_links.txt
writing top-level names to /tmp/pip-pip-egg-info-ydcnhb7u/psycopg2.egg-info/top_level.txt
writing manifest file '/tmp/pip-pip-egg-info-ydcnhb7u/psycopg2.egg-info/SOURCES.txt'
Error: pg_config executable not found.
pg_config is required to build psycopg2 from source. Please add the directory
containing pg_config to the $PATH or specify the full executable path with the
python setup.py build_ext --pg-config /path/to/pg_config build ...
or with the pg_config option in 'setup.cfg'.
If you prefer to avoid building psycopg2 from source, please install the PyPI
'psycopg2-binary' package instead.
For further information please check the 'doc/src/install.rst' file (also at
[end of output]
fly.toml has the following (auto-detected) build directive:
builder = "paketobuildpacks/builder:base"
Should that work, or do I need to specify something different / python-specific?
I’m having the same issue with my app.
Just for more information: I’m using python 3.8, SQLAlchemy, Flask, PostgreSQL 12 on Ubuntu in WSL, running a virtual environment.
Any help would be much appreciated!!
I gave up on using a builder and switched to a Dockerfile instead – I was getting unexplained timeouts when I specified a Paketo buildpack and the docs are pretty vague, so I Dockerised the app instead:
RUN apk update \
&& apk add libpq postgresql-dev \
&& apk add build-base
COPY ./requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt
COPY . /app
CMD ["gunicorn", "-b", "0.0.0.0:8080", "--workers", "3", "app:app"]
Be sure to edit the top-level
[build] section from your
fly.toml to remove the
buildpacks keys and use the dockerfile by using the
dockerfile = "Dockerfile" key, and ensure the
PORT key in
[env] matches the port you specify in your Dockerfile
CMD. Note also that you’ll need to tune the
workers setting in your Dockerfile to match the number of CPUs in your app – the rule of thumb is
num CPUs * 2 + 1.
I had the same problem.
I searched for a solution and found the following tweet
By putting psycopg2-binary instead of psycopg2 in requirements.txt, I was able to deploy successfully using the builder instead of Dockerfile.
(This text is converted from Japanese. Sorry if it is hard to read.)
psycopg2-binary is not intended for production use though: Installation — Psycopg 2.9.4 documentation
As I had same problem, in case anyone else is wondering about this, you can also use paketobuildpacks/builder:full instead of default paketobuildpacks/builder:base.
Full buildpack seems to include required dependencies for building psycopg2.
For future reference, if you had an auto-generated Dockerfile from using
fly launch, you can get the right dependencies in place by changing the line that has
PYTHON_VERSION=[version]-slim-[linux flavor] to
For example, mine was
PYTHON_VERSION=3.10-slim-buster and I changed it to
PYTHON_VERSION=3.10-buster and things are working now.