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
python-dev
package. – Disheveled