title: error: command 'gcc' failed with exit status 1 when installing pip packages on alpine docker image
body: <p>I'm attempting transition my base docker image from centos 7 to alpine, however I receive gcc errors when trying to install pip packages.</p>
  
  <p>This is a snippet of the error received:</p>
  
  <pre><code>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 -&gt; build/lib.linux-x86_64-2.7/guppy
      creating build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/docexample.py -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/test_heapyc.py -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/__init__.py -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/test_guppy.py -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/test_heapy.py -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      creating build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/Code.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/Cat.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/IterPermute.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/OutputHandling.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/KnuthBendix.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/KanExtension.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/Unpack.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/__init__.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/FSA.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/tkcursors.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/cmd.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/xterm.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/etc.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/ExecfileWithModuleInfo.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/Help.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/RE.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/RE_Rect.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/Glue.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/textView.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      copying guppy/etc/Compat.py -&gt; build/lib.linux-x86_64-2.7/guppy/etc
      creating build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/Html.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/Latex.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/DottedTree.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/Main.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/FileIO.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/Filer.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/__init__.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/XHTML.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/Text.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/Document.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/Gsml.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/Help.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/Exceptions.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/Tester.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      copying guppy/gsl/SpecNodes.py -&gt; build/lib.linux-x86_64-2.7/guppy/gsl
      creating build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/Spec.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/OutputHandling.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/Remote.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/RefPat.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/ImpSet.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/Monitor.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/Classifiers.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/__init__.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/RM.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/UniSet.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/View.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/Target.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/Doc.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/Prof.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/Part.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/Console.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/Use.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/Path.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/AbstractAlgebra.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/RemoteConstants.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy
      copying guppy/heapy/pbhelp.py -&gt; 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 -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/test_sf.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/test_heapyc.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/test_OutputHandling.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/test_Spec.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/__init__.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/test_View.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/test_Path.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/test_UniSet.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/test_menuleak.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/test_dependencies.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/test_RetaGraph.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/test_Part.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/test_all.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/test_RefPat.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/test_ER.py -&gt; build/lib.linux-x86_64-2.7/guppy/heapy/test
      copying guppy/heapy/test/support.py -&gt; 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 -&gt; build/lib.linux-x86_64-2.7/guppy/sets
      copying guppy/sets/__init__.py -&gt; build/lib.linux-x86_64-2.7/guppy/sets
      copying guppy/doc/gsl.html -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/heapy_UniSet.html -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/sets.html -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/heapyc.html -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/guppy.html -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/ProfileBrowser.html -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/heapy_tutorial.html -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/index.html -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/docexample.html -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/heapy_Use.html -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/gslexample.html -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/heapy_RootState.html -&gt; build/lib.linux-x86_64-2.7/guppy/doc
      copying guppy/doc/pbscreen.jpg -&gt; 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
  
  </code></pre>
  
  <p>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:</p>
  
  <pre><code>FROM alpine:latest
  
  RUN apk update &amp;&amp; apk upgrade
  RUN apk add --no-cache bash\
                         python \
                         pkgconfig \
                         git \
                         gcc \
                         openldap \
                         libcurl \
      &amp;&amp; rm -rf /var/cache/apk/*
  RUN wget https://bootstrap.pypa.io/get-pip.py &amp;&amp; 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
  </code></pre>
  
  <p>Uncommenting the <code>pip install -r requirements.txt</code> 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:</p>
  
  <pre><code>$ 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.
  </code></pre>
  
  <p>While in the docker container I can try pip installing a dependency on its own, however this gives a similar error as above:</p>
  
  <pre><code>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 -&gt; build/lib.linux-x86_64-2.7/gpgme
    copying gpgme/editutil.py -&gt; 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 &lt;Python.h&gt;
              ^~~~~~~~~~
    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 -&gt; build/lib.linux-x86_64-2.7/gpgme
      copying gpgme/editutil.py -&gt; 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 &lt;Python.h&gt;
                ^~~~~~~~~~
      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.
  </code></pre>
  
  <p>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?</p>
  
  <p><strong>Additional information:</strong> <br>
  Alpine version: 3.10.3 <br>
  python version: 2.7.16 <br>
  pip version: 19.3.1</p>