Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

error: command 'gcc' failed with exit status 1 when installing pip packages on alpine docker image

I'm attempting transition my base docker image from centos 7 to alpine, however I receive gcc errors when trying to install pip packages.

This is a snippet of the error received:

Successfully built backports.ssl-match-hostname configobj dpkt iniparse IPy kitchen logmatic-python maxminddb NeuroTools procfs pycparser python-json-logger pyudev repoze.lru scandir scapy
Failed to build guppy kiwisolver numpy psutil pygpgme pyliblzma python-ldap pyxattr subprocess32
Installing collected packages: atomicwrites, attrs, backports.functools-lru-cache, backports.ssl-match-hostname, certifi, chardet, six, configobj, configparser, contextlib2, cycler, decorator, dnspython, dpkt, urllib3, elasticsearch, elasticsearch5, elasticsearch6, funcsigs, ipaddress, maxminddb, idna, requests, geoip2, guppy, scandir, pathlib2, more-itertools, zipp, importlib-metadata, iniparse, IPy, kafka, kafka-python, kitchen, kiwisolver, python-json-logger, logmatic-python, mock, NeuroTools, numpy, pyparsing, packaging, pbr, ptyprocess, pexpect, pluggy, ply, procfs, psutil, py, pyasn1, pyasn1-modules, pycparser, pygpgme, pyliblzma, wcwidth, pytest, python-dateutil, python-ldap, pytz, pyudev, pyxattr, redis, repoze.lru, scapy, subprocess32, xmltodict
    Running setup.py install for guppy: started
    Running setup.py install for guppy: finished with status 'error'
    ERROR: Command errored out with exit status 1:
     command: /usr/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-PWr6Cn/guppy/setup.py'"'"'; __file__='"'"'/tmp/pip-install-PWr6Cn/guppy/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-ogmKgm/install-record.txt --single-version-externally-managed --compile
         cwd: /tmp/pip-install-PWr6Cn/guppy/
    Complete output (117 lines):
    running install
    running build
    running build_py
    creating build
    creating build/lib.linux-x86_64-2.7
    creating build/lib.linux-x86_64-2.7/guppy
    copying guppy/__init__.py -> build/lib.linux-x86_64-2.7/guppy
    creating build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/docexample.py -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/test_heapyc.py -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/__init__.py -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/test_guppy.py -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/test_heapy.py -> build/lib.linux-x86_64-2.7/guppy/doc
    creating build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/Code.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/Cat.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/IterPermute.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/OutputHandling.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/KnuthBendix.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/KanExtension.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/Unpack.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/__init__.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/FSA.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/tkcursors.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/cmd.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/xterm.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/etc.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/ExecfileWithModuleInfo.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/Help.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/RE.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/RE_Rect.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/Glue.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/textView.py -> build/lib.linux-x86_64-2.7/guppy/etc
    copying guppy/etc/Compat.py -> build/lib.linux-x86_64-2.7/guppy/etc
    creating build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/Html.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/Latex.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/DottedTree.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/Main.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/FileIO.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/Filer.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/__init__.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/XHTML.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/Text.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/Document.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/Gsml.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/Help.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/Exceptions.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/Tester.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    copying guppy/gsl/SpecNodes.py -> build/lib.linux-x86_64-2.7/guppy/gsl
    creating build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/Spec.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/OutputHandling.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/Remote.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/RefPat.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/ImpSet.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/Monitor.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/Classifiers.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/__init__.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/RM.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/UniSet.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/View.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/Target.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/Doc.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/Prof.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/Part.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/Console.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/Use.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/Path.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/AbstractAlgebra.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/RemoteConstants.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    copying guppy/heapy/pbhelp.py -> build/lib.linux-x86_64-2.7/guppy/heapy
    creating build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_Classifiers.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_sf.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_heapyc.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_OutputHandling.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_Spec.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/__init__.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_View.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_Path.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_UniSet.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_menuleak.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_dependencies.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_RetaGraph.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_Part.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_all.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_RefPat.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/test_ER.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    copying guppy/heapy/test/support.py -> build/lib.linux-x86_64-2.7/guppy/heapy/test
    creating build/lib.linux-x86_64-2.7/guppy/sets
    copying guppy/sets/test.py -> build/lib.linux-x86_64-2.7/guppy/sets
    copying guppy/sets/__init__.py -> build/lib.linux-x86_64-2.7/guppy/sets
    copying guppy/doc/gsl.html -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/heapy_UniSet.html -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/sets.html -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/heapyc.html -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/guppy.html -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/ProfileBrowser.html -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/heapy_tutorial.html -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/index.html -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/docexample.html -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/heapy_Use.html -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/gslexample.html -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/heapy_RootState.html -> build/lib.linux-x86_64-2.7/guppy/doc
    copying guppy/doc/pbscreen.jpg -> build/lib.linux-x86_64-2.7/guppy/doc
    running build_ext
    building 'guppy.sets.setsc' extension
    creating build/temp.linux-x86_64-2.7
    creating build/temp.linux-x86_64-2.7/src
    creating build/temp.linux-x86_64-2.7/src/sets
    gcc -fno-strict-aliasing -Os -fomit-frame-pointer -g -DNDEBUG -Os -fomit-frame-pointer -g -DTHREAD_STACK_SIZE=0x100000 -fPIC -I/usr/include/python2.7 -c src/sets/sets.c -o build/temp.linux-x86_64-2.7/src/sets/sets.o
    src/sets/sets.c:33:10: fatal error: Python.h: No such file or directory
     #include "Python.h"
              ^~~~~~~~~~
    compilation terminated.
    error: command 'gcc' failed with exit status 1
    ----------------------------------------
ERROR: Command errored out with exit status 1: /usr/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-PWr6Cn/guppy/setup.py'"'"'; __file__='"'"'/tmp/pip-install-PWr6Cn/guppy/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-ogmKgm/install-record.txt --single-version-externally-managed --compile Check the logs for full command output.
The command '/bin/sh -c pip install -r /home/admin/container_files/requirements.txt' returned a non-zero code: 1

I can only derive that gcc is not being installed (correctly?) despite being listed in my Dockerfile below. I've also attempted to run it within its own level in case that would install it correctly:

FROM alpine:latest

RUN apk update && apk upgrade
RUN apk add --no-cache bash\
                       python \
                       pkgconfig \
                       git \
                       gcc \
                       openldap \
                       libcurl \
    && rm -rf /var/cache/apk/*
RUN wget https://bootstrap.pypa.io/get-pip.py && python get-pip.py

ADD requirements.txt /home/admin/container_files/
RUN pip install setuptools==30.1.0
RUN pip install -r /home/admin/container_files/requirements.txt

Uncommenting the pip install -r requirements.txt line results in the image being built. After ssh'ing into an instance of the image, gcc does appear to be installed, however I'm unsure why it would then error above:

$ docker run -it alpine-image bash
bash-5.0# gcc --version
gcc (Alpine 8.3.0) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

While in the docker container I can try pip installing a dependency on its own, however this gives a similar error as above:

bash-5.0# pip install pygpgme
Collecting pygpgme
  Using cached https://files.pythonhosted.org/packages/dc/96/b2bcbd3a216af313bb9045c2e573aa18653876a65db471b86be7598234dd/pygpgme-0.3.tar.gz
Building wheels for collected packages: pygpgme
  Building wheel for pygpgme (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /usr/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-ih85iq/pygpgme/setup.py'"'"'; __file__='"'"'/tmp/pip-install-ih85iq/pygpgme/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-1HBTfc --python-tag cp27
       cwd: /tmp/pip-install-ih85iq/pygpgme/
  Complete output (18 lines):
  running bdist_wheel
  running build
  running build_py
  creating build
  creating build/lib.linux-x86_64-2.7
  creating build/lib.linux-x86_64-2.7/gpgme
  copying gpgme/__init__.py -> build/lib.linux-x86_64-2.7/gpgme
  copying gpgme/editutil.py -> build/lib.linux-x86_64-2.7/gpgme
  running build_ext
  building 'gpgme._gpgme' extension
  creating build/temp.linux-x86_64-2.7
  creating build/temp.linux-x86_64-2.7/src
  gcc -fno-strict-aliasing -Os -fomit-frame-pointer -g -DNDEBUG -Os -fomit-frame-pointer -g -DTHREAD_STACK_SIZE=0x100000 -fPIC -I/usr/include/python2.7 -c src/gpgme.c -o build/temp.linux-x86_64-2.7/src/gpgme.o
  src/gpgme.c:21:10: fatal error: Python.h: No such file or directory
   #include <Python.h>
            ^~~~~~~~~~
  compilation terminated.
  error: command 'gcc' failed with exit status 1
  ----------------------------------------
  ERROR: Failed building wheel for pygpgme
  Running setup.py clean for pygpgme
Failed to build pygpgme
Installing collected packages: pygpgme
    Running setup.py install for pygpgme ... error
    ERROR: Command errored out with exit status 1:
     command: /usr/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-ih85iq/pygpgme/setup.py'"'"'; __file__='"'"'/tmp/pip-install-ih85iq/pygpgme/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-1HWn3q/install-record.txt --single-version-externally-managed --compile
         cwd: /tmp/pip-install-ih85iq/pygpgme/
    Complete output (18 lines):
    running install
    running build
    running build_py
    creating build
    creating build/lib.linux-x86_64-2.7
    creating build/lib.linux-x86_64-2.7/gpgme
    copying gpgme/__init__.py -> build/lib.linux-x86_64-2.7/gpgme
    copying gpgme/editutil.py -> build/lib.linux-x86_64-2.7/gpgme
    running build_ext
    building 'gpgme._gpgme' extension
    creating build/temp.linux-x86_64-2.7
    creating build/temp.linux-x86_64-2.7/src
    gcc -fno-strict-aliasing -Os -fomit-frame-pointer -g -DNDEBUG -Os -fomit-frame-pointer -g -DTHREAD_STACK_SIZE=0x100000 -fPIC -I/usr/include/python2.7 -c src/gpgme.c -o build/temp.linux-x86_64-2.7/src/gpgme.o
    src/gpgme.c:21:10: fatal error: Python.h: No such file or directory
     #include <Python.h>
              ^~~~~~~~~~
    compilation terminated.
    error: command 'gcc' failed with exit status 1
    ----------------------------------------
ERROR: Command errored out with exit status 1: /usr/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-ih85iq/pygpgme/setup.py'"'"'; __file__='"'"'/tmp/pip-install-ih85iq/pygpgme/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-1HWn3q/install-record.txt --single-version-externally-managed --compile Check the logs for full command output.

I'd like to understand why gcc is behaving in this way, and if there is a better way to transition to an alpine image from centos?

Additional information:
Alpine version: 3.10.3
python version: 2.7.16
pip version: 19.3.1

like image 204
solarflare Avatar asked Oct 30 '19 15:10

solarflare


1 Answers

Missing the header file Python.h , this file is provide by python2-dev ( -dev mean package for doing development with ) .

With this https://pkgs.alpinelinux.org/contents you can search all packages that have Python.h

I was able to run pip install pygpgme by adding these 3 packages :

  • python2-dev
  • gpgme-dev
  • libc-dev

And the Dockerfile will be :

FROM alpine:latest

RUN apk update && apk upgrade
RUN apk add --no-cache bash\
                       python \
                       pkgconfig \
                       git \
                       gcc \
                       openldap \
                       libcurl \
                       python2-dev \
                       gpgme-dev \
                       libc-dev \
    && rm -rf /var/cache/apk/*
RUN wget https://bootstrap.pypa.io/get-pip.py && python get-pip.py
RUN pip install setuptools==30.1.0
like image 76
EchoMike444 Avatar answered Oct 18 '22 01:10

EchoMike444