10

我正在尝试将我的基本 docker 映像从 centos 7 转换为 alpine,但是在尝试安装 pip 包时收到 gcc 错误。

这是收到的错误片段:

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

尽管在下面的 Dockerfile 中列出,但我只能得出没有安装 gcc(正确吗?)。我还尝试在它自己的级别内运行它,以防它正确安装:

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

取消注释该pip install -r requirements.txt行会生成正在构建的图像。在 ssh 进入图像实例后,似乎确实安装了 gcc,但是我不确定为什么它会在上面出错:

$ 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.

在 docker 容器中,我可以尝试 pip 自行安装依赖项,但这会产生与上述类似的错误:

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.

我想了解为什么 gcc 会以这种方式运行,以及是否有更好的方法可以从 centos 过渡到高山图像?

附加信息:
Alpine 版本:3.10.3
python 版本:2.7.16
pip 版本:19.3.1

4

1 回答 1

7

缺少头文件Python.h,此文件由python2-dev-dev用于开发的平均包)提供。

使用此https://pkgs.alpinelinux.org/contents,您可以搜索所有具有Python.h

我可以pip install pygpgme 通过添加这 3 个包来运行:

  • python2-dev
  • gpgme-开发
  • libc开发

Dockerfile是:

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
于 2019-10-31T04:59:15.777 回答