Alpine Linux에 Pandas를 설치하는 데 시간이 걸리는 이유


105

기본 OS Alpine 대 CentOS 또는 Debian을 사용하여 Docker 컨테이너에 Pandas 및 Numpy (종속성)를 설치하는 데 훨씬 오래 걸린다는 사실을 확인했습니다. 시차를 보여주기 위해 아래에 작은 테스트를 만들었습니다. Alpine이 Pandas 및 Numpy를 설치하기 위해 빌드 종속성을 업데이트하고 다운로드하는 데 몇 초가 걸리는 것 외에도 setup.py가 데비안 설치보다 약 70 배 더 많은 시간이 걸리는 이유는 무엇입니까?

Alpine을 기본 이미지로 사용하여 설치 속도를 높일 수있는 방법이 있습니까? 아니면 Pandas 및 Numpy와 같은 패키지에 사용하는 것이 더 좋은 Alpine과 비슷한 크기의 다른 기본 이미지가 있습니까?

Dockerfile.debian

FROM python:3.6.4-slim-jessie

RUN pip install pandas

Pandas 및 Numpy로 Debian 이미지를 빌드합니다.

[PandasDockerTest] time docker build -t debian-pandas -f Dockerfile.debian . --no-cache
    Sending build context to Docker daemon  3.072kB
    Step 1/2 : FROM python:3.6.4-slim-jessie
     ---> 43431c5410f3
    Step 2/2 : RUN pip install pandas
     ---> Running in 2e4c030f8051
    Collecting pandas
      Downloading pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl (26.2MB)
    Collecting numpy>=1.9.0 (from pandas)
      Downloading numpy-1.14.1-cp36-cp36m-manylinux1_x86_64.whl (12.2MB)
    Collecting pytz>=2011k (from pandas)
      Downloading pytz-2018.3-py2.py3-none-any.whl (509kB)
    Collecting python-dateutil>=2 (from pandas)
      Downloading python_dateutil-2.6.1-py2.py3-none-any.whl (194kB)
    Collecting six>=1.5 (from python-dateutil>=2->pandas)
      Downloading six-1.11.0-py2.py3-none-any.whl
    Installing collected packages: numpy, pytz, six, python-dateutil, pandas
    Successfully installed numpy-1.14.1 pandas-0.22.0 python-dateutil-2.6.1 pytz-2018.3 six-1.11.0
    Removing intermediate container 2e4c030f8051
     ---> a71e1c314897
    Successfully built a71e1c314897
    Successfully tagged debian-pandas:latest
    docker build -t debian-pandas -f Dockerfile.debian . --no-cache  0.07s user 0.06s system 0% cpu 13.605 total

Dockerfile.alpine

FROM python:3.6.4-alpine3.7

RUN apk --update add --no-cache g++

RUN pip install pandas

Pandas & Numpy로 알파인 이미지 빌드 :

[PandasDockerTest] time docker build -t alpine-pandas -f Dockerfile.alpine . --no-cache
Sending build context to Docker daemon   16.9kB
Step 1/3 : FROM python:3.6.4-alpine3.7
 ---> 4b00a94b6f26
Step 2/3 : RUN apk --update add --no-cache g++
 ---> Running in 4b0c32551e3f
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
(1/17) Upgrading musl (1.1.18-r2 -> 1.1.18-r3)
(2/17) Installing libgcc (6.4.0-r5)
(3/17) Installing libstdc++ (6.4.0-r5)
(4/17) Installing binutils-libs (2.28-r3)
(5/17) Installing binutils (2.28-r3)
(6/17) Installing gmp (6.1.2-r1)
(7/17) Installing isl (0.18-r0)
(8/17) Installing libgomp (6.4.0-r5)
(9/17) Installing libatomic (6.4.0-r5)
(10/17) Installing pkgconf (1.3.10-r0)
(11/17) Installing mpfr3 (3.1.5-r1)
(12/17) Installing mpc1 (1.0.3-r1)
(13/17) Installing gcc (6.4.0-r5)
(14/17) Installing musl-dev (1.1.18-r3)
(15/17) Installing libc-dev (0.7.1-r0)
(16/17) Installing g++ (6.4.0-r5)
(17/17) Upgrading musl-utils (1.1.18-r2 -> 1.1.18-r3)
Executing busybox-1.27.2-r7.trigger
OK: 184 MiB in 50 packages
Removing intermediate container 4b0c32551e3f
 ---> be26c3bf4e42
Step 3/3 : RUN pip install pandas
 ---> Running in 36f6024e5e2d
Collecting pandas
  Downloading pandas-0.22.0.tar.gz (11.3MB)
Collecting python-dateutil>=2 (from pandas)
  Downloading python_dateutil-2.6.1-py2.py3-none-any.whl (194kB)
Collecting pytz>=2011k (from pandas)
  Downloading pytz-2018.3-py2.py3-none-any.whl (509kB)
Collecting numpy>=1.9.0 (from pandas)
  Downloading numpy-1.14.1.zip (4.9MB)
Collecting six>=1.5 (from python-dateutil>=2->pandas)
  Downloading six-1.11.0-py2.py3-none-any.whl
Building wheels for collected packages: pandas, numpy
  Running setup.py bdist_wheel for pandas: started
  Running setup.py bdist_wheel for pandas: still running...
  Running setup.py bdist_wheel for pandas: still running...
  Running setup.py bdist_wheel for pandas: still running...
  Running setup.py bdist_wheel for pandas: still running...
  Running setup.py bdist_wheel for pandas: still running...
  Running setup.py bdist_wheel for pandas: still running...
  Running setup.py bdist_wheel for pandas: finished with status 'done'
  Stored in directory: /root/.cache/pip/wheels/e8/ed/46/0596b51014f3cc49259e52dff9824e1c6fe352048a2656fc92
  Running setup.py bdist_wheel for numpy: started
  Running setup.py bdist_wheel for numpy: still running...
  Running setup.py bdist_wheel for numpy: still running...
  Running setup.py bdist_wheel for numpy: still running...
  Running setup.py bdist_wheel for numpy: finished with status 'done'
  Stored in directory: /root/.cache/pip/wheels/9d/cd/e1/4d418b16ea662e512349ef193ed9d9ff473af715110798c984
Successfully built pandas numpy
Installing collected packages: six, python-dateutil, pytz, numpy, pandas
Successfully installed numpy-1.14.1 pandas-0.22.0 python-dateutil-2.6.1 pytz-2018.3 six-1.11.0
Removing intermediate container 36f6024e5e2d
 ---> a93c59e6a106
Successfully built a93c59e6a106
Successfully tagged alpine-pandas:latest
docker build -t alpine-pandas -f Dockerfile.alpine . --no-cache  0.54s user 0.33s system 0% cpu 16:08.47 total

1
.apk를 사용할 수 있으므로 소스에서 빌드 할 필요가 없습니다. pkgs.alpinelinux.org/packages?name= * pandas & branch = edge
jtlz2

1
@ jtlz2, pandas는 Alpine의 분기 가장자리에서 사용할 수 없습니다. 유감이다 ...
fccoelho

@fccoelho 지금 다시 사용할 수 있습니다!
jtlz2

답변:


66

Debian 기반 이미지 python pip는 다음 .whl형식의 패키지를 설치 하는 데만 사용됩니다 .

  Downloading pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl (26.2MB)
  Downloading numpy-1.14.1-cp36-cp36m-manylinux1_x86_64.whl (12.2MB)

WHL 형식은 매번 소스 코드에서 다시 빌드하는 것보다 Python 소프트웨어를 설치하는 더 빠르고 안정적인 방법으로 개발되었습니다. WHL 파일은 설치할 대상 시스템의 올바른 위치로만 이동하면되지만 소스 배포에는 설치 전에 빌드 단계가 필요합니다.

휠 패키지 pandas이며 numpyAlpine 플랫폼 기반 이미지에서는 지원되지 않습니다. 그렇기 때문에 python pip빌드 프로세스 중에 사용하여 설치할 때 항상 알파인의 소스 파일에서 컴파일합니다.

  Downloading pandas-0.22.0.tar.gz (11.3MB)
  Downloading numpy-1.14.1.zip (4.9MB)

이미지를 빌드하는 동안 다음과 같은 내부 컨테이너를 볼 수 있습니다.

/ # ps aux
PID   USER     TIME   COMMAND
    1 root       0:00 /bin/sh -c pip install pandas
    7 root       0:04 {pip} /usr/local/bin/python /usr/local/bin/pip install pandas
   21 root       0:07 /usr/local/bin/python -c import setuptools, tokenize;__file__='/tmp/pip-build-en29h0ak/pandas/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n
  496 root       0:00 sh
  660 root       0:00 /bin/sh -c gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DTHREAD_STACK_SIZE=0x100000 -fPIC -Ibuild/src.linux-x86_64-3.6/numpy/core/src/pri
  661 root       0:00 gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DTHREAD_STACK_SIZE=0x100000 -fPIC -Ibuild/src.linux-x86_64-3.6/numpy/core/src/private -Inump
  662 root       0:00 /usr/libexec/gcc/x86_64-alpine-linux-musl/6.4.0/cc1 -quiet -I build/src.linux-x86_64-3.6/numpy/core/src/private -I numpy/core/include -I build/src.linux-x86_64-3.6/numpy/core/includ
  663 root       0:00 ps aux

Dockerfile약간 수정 하면 :

FROM python:3.6.4-alpine3.7
RUN apk add --no-cache g++ wget
RUN wget https://pypi.python.org/packages/da/c6/0936bc5814b429fddb5d6252566fe73a3e40372e6ceaf87de3dec1326f28/pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl
RUN pip install pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl

다음과 같은 오류가 발생합니다.

Step 4/4 : RUN pip install pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl
 ---> Running in 0faea63e2bda
pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl is not a supported wheel on this platform.
The command '/bin/sh -c pip install pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl' returned a non-zero code: 1

불행히도 pandasAlpine 이미지에 설치하는 유일한 방법 은 빌드가 완료 될 때까지 기다리는 것입니다.

물론 pandasCI에서 알파인 이미지를 사용하려는 경우 가장 좋은 방법은 한 번 컴파일하여 레지스트리에 푸시 한 다음 필요에 따라 기본 이미지로 사용하는 것입니다.

편집 : 알파인 이미지를 사용하려면 pandasnickgryg / alpine-pandas 도커 이미지를 가져올 수 있습니다 . pandas알파인 플랫폼에서 사전 컴파일 된 파이썬 이미지입니다 . 시간을 절약 할 수 있습니다.


3
글쎄, 너무 나쁘다. 그러나 six, pytz 및 python-dateutil이 Alpine에서 .whl 패키지를 다운로드하는 것처럼 보입니다. 판다를위한 바퀴와 알파인을위한 numpy를 만드는 것이 가능하다는 것을 의미하지만 현재는 일어나지 않고있는 것일까 요?
moku

아니, 바퀴를 구축 할 수 없습니다 pandasnampy고산 플랫폼. 그 바퀴는 그것을 지원하지 않습니다. 나는 대답 pandas에서 알파인 이미지의 휠 패키지에서 설치하려고 할 때 그것을 보여주었습니다 .
nickgryg

@Nickolay 재활용 할 수있는 해결 방법이 있습니까 pandas구축 했다 기반으로 구축 된 alpine후 캐시는? (이것은 로컬 어딘가에서 호스팅 될 수 있음)
jtlz2

2
그 이유는 이러한 휠에 c / c ++에서 빌드되고 glibc와 연결된 바이너리가 포함되어 있지만 alpine에는 glibc가없고 대신 musl을 사용하기 때문입니다. 즉, 새로운 바이너리가 musl에 대해 컴파일되고 연결되어야 함을 의미합니다.
ThisGuyCantEven 2010 년

36

답변 : 2020 년 3 월 9 일 현재, PYTHON 3의 경우 여전히 그렇지 않습니다!

다음은 완전히 작동하는 Dockerfile입니다.

FROM python:3.7-alpine
RUN echo "@testing http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
RUN apk add --update --no-cache py3-numpy py3-pandas@testing

빌드는 정확한 파이썬 및 알파인 버전 번호에 매우 민감합니다. 이러한 오류가 발생하면 Max Levy의 오류가 발생하는 것 같습니다. so:libpython3.7m.so.1.0 (missing) 하는 것처럼 보이지만 위의 내용은 이제 저에게 적합합니다.

업데이트 된 Dockerfile은 https://gist.github.com/jtlz2/b0f4bc07ce2ff04bc193337f2327c13b 에서 사용할 수 있습니다.


[이전 업데이트 :]

답변 : 그렇지 않습니다!

Alpine Dockerfile에서 간단히 수행 할 수 있습니다 *

RUN apk add py2-numpy@community py2-scipy@community py-pandas@edge

이 때문에이며 numpy, scipy지금 pandas에 사용 가능한 모든 사전 구축하다alpine .

https://pkgs.alpinelinux.org/packages?name=*numpy

https://pkgs.alpinelinux.org/packages?name=*scipy&branch=edge

https://pkgs.alpinelinux.org/packages?name=*pandas&branch=edge

매번 다시 빌드하거나 Docker 계층을 사용하지 않는 한 가지 방법은 미리 빌드 된 기본 Alpine Linux / .apk패키지 를 사용하는 것입니다.

https://github.com/sgerrand/alpine-pkg-py-pandas

https://github.com/nbgallery/apks

.apk이들을 한 번 빌드 하고 원하는 Dockerfile 어디에서나 사용할 수 있습니다. :)

이는 또한 사실 전에 다른 모든 것을 Docker 이미지에 구워야하는 시간을 줄여줍니다. 즉, 원하는 Docker 이미지를 사전 빌드 할 수있는 유연성이 있습니다.

추신 : https://gist.github.com/jtlz2/b0f4bc07ce2ff04bc193337f2327c13b에 Dockerfile 스텁을 넣어 대략 이미지를 빌드하는 방법을 보여줍니다. 여기에는 중요한 단계 (*)가 포함됩니다.

RUN echo "@community http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories
RUN apk update
RUN apk add --update --no-cache libgfortran

2
최근에 삭제 된 것 같나요? pkgs.alpinelinux.org/package/edge/testing/x86/py-pandas
jtlz2

1
@ChrisWedgwood 그들은 적극적으로 작업하고 있습니다 -github.com/alpinelinux/aports/pull/6330
jtlz2

1
@ChrisWedgwood 다시 작업, 휴!
jtlz2


1
@ jtlz2 나는 3.7-slim-buster로 전환했고 모든 것이 순조롭게 진행되었습니다. pythonspeed.com/articles/base-image-python-docker-images
xristian

9

주의 최신 업데이트로
@ jtlz2 답변을보십시오.

시대에 뒤쳐진

따라서 py3-pandas 및 py3-numpy 패키지가 테스트 알파인 저장소로 이동되었으므로 Dockerfile에 다음 줄을 추가하여 다운로드 할 수 있습니다.

RUN echo "http://dl-8.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \
  && apk update \
  && apk add py3-numpy py3-pandas

누군가에게 도움이되기를 바랍니다!

산악 링크 패키지
- py3 - 팬더
- py3-NumPy와를

알파인 리포지토리 도크 정보 .


이것은 나를 위해 일했습니다! 업데이트 된 답변을 제공해 주셔서 감사합니다!
Stratus3D

2
내 대답에 고정
jtlz2

1
@, 답장을 보내 주셔서 감사를 jtlz2의 멋진가, 감사합니다,하지만 난 대신 고산의 데비안 버스터로 이동 didnt 한 고산 다시 설치했지만, 어쨌든도 내 대답은 고정
stefanitsky

1
py3-pandas는 3.11.x에서 사용할 수 없으며,이 댓글을 작성하는 시점에서 'edge'릴리스에만 있습니다. 편집 : 분명히 그것은 위의 게시물에서 방금 그 참조를 놓쳤습니다. 죄송합니다.
썩은

6

이 답변 중 일부를 하나의 답변으로 모아 놓친 것 같은 세부 사항을 추가하겠습니다. 특정 파이썬 라이브러리, 특히 최적화 된 수학 및 데이터 라이브러리가 알파인에서 빌드하는 데 시간이 오래 걸리는 이유는 이러한 라이브러리의 pip 휠에 c / c ++에서 사전 컴파일되고 glibc공통 C 표준 라이브러리 세트에 연결된 바이너리가 포함되어 있기 때문 입니다. Debian, Fedora, CentOS는 모두 (일반적으로)를 사용 glibc하지만 경량을 유지하기 위해 alpine을 musl-libc대신 사용 합니다. A의 C / C ++ 바이너리 빌드 glibc시스템이없는 시스템에서 작동하지 않습니다 glibc와 같은 간다 musl.

Pip은 먼저 올바른 바이너리가있는 휠을 찾고, 찾을 수없는 경우 c / c ++ 소스에서 바이너리를 컴파일하고 musl에 연결합니다. 대부분의 경우, python 헤더가 python3-dev없거나 make.

이제 은색 라이닝은 다른 사람들이 언급했듯이 apk커뮤니티에서 제공하는 적절한 바이너리 가 포함 된 패키지가 있습니다.이를 사용하면 바이너리를 빌드하는 (때로는 긴) 프로세스를 절약 할 수 있습니다.


6

여기에 진짜 정직한 충고를하고 데비안 기반 이미지로 전환하면 모든 문제가 사라질 것입니다.

Python 애플리케이션 용 Alpine은 제대로 작동하지 않습니다.

다음은 내 예입니다 dockerfile.

FROM python:3.7.6-buster

RUN pip install pandas==1.0.0
RUN pip install sklearn
RUN pip install Django==3.0.2
RUN pip install cx_Oracle==7.3.0
RUN pip install excel
RUN pip install djangorestframework==3.11.0

그만큼 python:3.7.6-buster 이 경우에 더 적합합니다,뿐만 아니라, 당신은 OS에 여분의 의존성을 필요가 없습니다.

유용한 최신 기사를 따르십시오 : https://pythonspeed.com/articles/alpine-docker-python/ :

Python 이미지에 Alpine Linux를 사용하지 마십시오. 훨씬 더 느린 빌드 시간, 더 큰 이미지, 더 많은 작업 및 모호한 버그 가능성을 원하지 않는 한 Alpine Linux를 기본 이미지로 사용하지 않는 것이 좋습니다. 무엇을 사용해야하는지에 대한 몇 가지 권장 사항은 좋은 기본 이미지 선택에 대한 내 기사를 참조하십시오.


1
이미지의 레이어 수를 줄일 수 있습니다. 즉, RUN 명령 블록을 사용하는 대신 RUN pip install <packegeA> && pip install <packageB> 등을 사용할 수 있습니다. 빌드 성능에 영향을줍니다. :)
p0l00ck

또한 사용 pip --no-cache하여 더 많은 공간을 면도 할 수 있습니다 . 정말해야 할 일은 requirements.txt파일에 한 줄씩 넣는 것입니다.pip install --no-cache -r requirements.txt
ThisGuyCantEven

1

이것은 나를 위해 일했습니다.

FROM python:3.8-alpine
RUN echo "@testing http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
RUN apk add --update --no-cache py3-numpy py3-pandas@testing
ENV PYTHONPATH=/usr/lib/python3.8/site-packages

COPY . /app
WORKDIR /app

RUN pip install -r requirements.txt

EXPOSE 5003 
ENTRYPOINT [ "python" ] 
CMD [ "app.py" ]

여기에있는 대부분의 코드는 동일한 스레드와 Faylixejtlz2에 대한 답변입니다. 와 다른 스레드 .

더 가벼운 pandas 버전은 Alpine 저장소에 py3-numpy있지만 Python이 기본적으로 가져 오기를 읽는 동일한 파일 경로에 설치되지 않습니다. 따라서 ENV. 또한 알파인 버전에 유의하십시오.


0

pandas커뮤니티 지원 패키지로 간주되므로 edge/testingAlpine이 공식적으로 팬더를 핵심 패키지로 지원하지 않기 때문에 가리키는 답변 이 작동하지 않습니다 (아직 작동하지만 핵심 Alpine 개발자가 지원하지 않음).

이 Dockerfile을 시도하십시오.

FROM python:3.8-alpine
RUN echo "@community http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories \
&& apk add py3-pandas@community

이것은 바닐라 알파인 이미지에서도 FROM alpine:3.12.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.