Pandaları Alpine Linux'a kurmak neden uzun sürüyor?


103

Temel işletim sistemi Alpine, CentOS veya Debian kullanarak bir Docker konteynerine Pandas ve Numpy (bağımlılıktır) kurmanın çok daha uzun sürdüğünü fark ettim. Saat farkını göstermek için aşağıda küçük bir test oluşturdum. Alpine'in Pandas ve Numpy'yi kurmak için derleme bağımlılıklarını güncellemesi ve indirmesi için geçen birkaç saniyenin yanı sıra, setup.py neden Debian kurulumundan yaklaşık 70 kat daha fazla zaman alıyor?

Alpine'yi temel görüntü olarak kullanarak kurulumu hızlandırmanın herhangi bir yolu var mı yoksa Alpine ile karşılaştırılabilir boyutta, Pandalar ve Numpy gibi paketler için kullanılması daha iyi olan başka bir temel görüntü var mı?

Dockerfile.debian

FROM python:3.6.4-slim-jessie

RUN pip install pandas

Pandalar ve Numpy ile Debian imajını oluşturun:

[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

Pandalar ve Numpy ile Alp görüntüsü oluşturun:

[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 artık kullanılabilir, bu nedenle sıfır kaynaktan derlemeye gerek yok - pkgs.alpinelinux.org/packages?name= * pandas & branch = edge
jtlz2

1
@ jtlz2, pandalar Alpine'nin dal kenarında bulunmaz. ne yazık ...
fccoelho

@fccoelho Şimdi tekrar kullanılabilir!
jtlz2

Yanıtlar:


65

Debian tabanlı görüntüler yalnızca python pipşu .whlformattaki paketleri kurmak için kullanılır :

  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 formatı, Python yazılımını kurmanın her seferinde kaynak koddan yeniden oluşturmaya göre daha hızlı ve daha güvenilir bir yöntemi olarak geliştirilmiştir. WHL dosyalarının yalnızca kurulacak hedef sistemde doğru konuma taşınması gerekir, oysa bir kaynak dağıtımı kurulumdan önce bir oluşturma adımı gerektirir.

Paketler Tekerlek pandasve numpyAlp platformuna dayalı görüntülerde desteklenmez. Bu yüzden onları python pipinşa sürecinde kullanarak kurduğumuzda, onları her zaman alpine'deki kaynak dosyalardan derliyoruz:

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

ve görüntü oluşturma sırasında aşağıdaki kapsayıcıyı görebiliriz:

/ # 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

DockerfileBiraz değiştirirsek :

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

aşağıdaki hatayı alıyoruz:

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

Ne yazık ki, pandasbir Alpine görüntüsüne yüklemenin tek yolu, derleme bitene kadar beklemektir.

Elbette pandas, örneğin CI'da Alpine görüntüsünü kullanmak istiyorsanız , bunu yapmanın en iyi yolu onu bir kez derlemek, herhangi bir kayıt defterine itmek ve ihtiyaçlarınız için temel görüntü olarak kullanmaktır.

DÜZENLEME: Alpine imajını birlikte kullanmak istiyorsanız nickgryg / alpine-pandas docker imajımıpandas çekebilirsiniz . Alpine platformunda önceden derlenmiş bir python görüntüsüdür . Zaman kazandırmalı.pandas


3
Bu çok kötü. Ancak, görünüşe göre altı, pytz ve python-dateutil .whl paketlerini Alpine'de indiriyor. Bu, pandalar için tekerlekler ve Alpine için uyuşukluk yapmanın mümkün olduğu anlamına mı geliyor, ancak şu anda olmuyor mu?
moku

Hayır, için tekerlekleri inşa etmek mümkün değildir pandasve nampyalpin platformunda. Bu tekerlekler onu desteklemiyor. pandasAlpin görüntüsünde tekerlek paketinden yüklemeye çalışıldığında cevabımda bunu gösterdim .
nickgryg

@Nickolay bir geri dönüşüm bir çözüm yolu var mı pandasyapı vardır üzerine inşa edilmiş alpineve daha sonra önbelleğe? (bu yerel olarak bir yerde barındırılabilir)
jtlz2

2
Bunun bu şekilde olmasının nedeni, bu tekerleklerin c / c ++ 'dan oluşturulan ve glibc ile bağlantılı ikili dosyalar içermesi, ancak alpinin glibc'ye sahip olmaması, bunun yerine musl kullanmasıdır, bu da yeni ikili dosyaların derlenmesi ve musl'a karşı bağlanması gerektiği anlamına gelir.
ThisGuyCant

36

CEVAP: 09.03.2020 İTİBARİYLE PYTHON 3 İÇİN HALA YOKTUR!

İşte eksiksiz çalışan bir 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

Yapı, tam python ve alp sürüm numaralarına karşı çok hassastır - bunları yanlış yapmak Max Levy'nin hatasını kışkırtır so:libpython3.7m.so.1.0 (missing)- ancak yukarıdakiler artık benim için çalışıyor.

Güncellenen Dockerfile'ıma https://gist.github.com/jtlz2/b0f4bc07ce2ff04bc193337f2327c13b adresinden ulaşılabilir


[Önceki Güncelleme:]

CEVAP: YOKTUR!

Herhangi bir Alpine Dockerfile'da şunları yapabilirsiniz *

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

Bunun nedeni numpy, scipyve şimdi pandastümünün önceden oluşturulmuş olmasıdır 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

Her seferinde yeniden inşa etmekten veya bir Docker katmanı kullanmaktan kaçınmanın bir yolu, önceden oluşturulmuş, yerel bir Alpine Linux / .apkpaketi kullanmaktır, örn.

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

https://github.com/nbgallery/apks

Bunları bir .apkkez oluşturabilir ve Dockerfile'nizde istediğiniz her yerde kullanabilirsiniz :)

Bu aynı zamanda, diğer her şeyi daha önce Docker görüntüsünde pişirmenize gerek kalmaz - yani, sevdiğiniz herhangi bir Docker görüntüsünü önceden oluşturma esnekliği.

Not: https://gist.github.com/jtlz2/b0f4bc07ce2ff04bc193337f2327c13b adresinde görüntünün kabaca nasıl oluşturulacağını gösteren bir Dockerfile saplaması koydum . Bunlar önemli adımları içerir (*):

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
Görünüşe göre yakın zamanda kaldırılmış mı? pkgs.alpinelinux.org/package/edge/testing/x86/py-pandas
jtlz2

1
@ChrisWedgwood Aktif olarak üzerinde çalışıyorlar - bkz. Github.com/alpinelinux/aports/pull/6330
jtlz2

1
@ChrisWedgwood Yine çalışıyor, vay be!
jtlz2


1
Ben 3.7 ince uçağı bölümüne geçtikten ve her şey gitti @ jtlz2 sorunsuz orada pythonspeed.com/articles/base-image-python-docker-images
xristian

9

DİKKAT En son güncellemeyle
birlikte @ jtlz2 yanıtına bakın

GEÇMİŞ

Böylece, py3-pandas & py3-numpy paketleri test alpine deposuna taşındı, böylece Dockerfile'ınıza şu satırları ekleyerek indirebilirsiniz:

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

Umarım birine yardımcı olur!

Alp paketleri bağlantıları:
- py3-pandas
- py3-numpy

Alpine depoları docks bilgisi .


Bu benim için çalıştı! Güncellenmiş bir cevap verdiğiniz için teşekkürler!
Stratus3D


1
@ jtlz2 güzel, teşekkürler, ama alp yerine debian buster'a geçtim ve alpine ile tekrar yüklemeyi denemedim, ama yine de, cevabım için teşekkürler, cevabımı da düzelttim
stefanitsky

1
Py3-pandas'ın 3.11.x için mevcut olmadığını belirtmek isterim, sadece bu yorumu yazdığım andan itibaren 'edge' sürümünde. düzenleme: Açıkçası yukarıdaki yazıda, bu referansı daha önce kaçırdığımı söylüyor, üzgünüm.
çürümüş

5

Sadece bu cevaplardan bazılarını tek bir cevapta bir araya getirip gözden kaçırıldığını düşündüğüm bir ayrıntı ekleyeceğim. Bazı python kitaplıklarının, özellikle optimize edilmiş matematik ve veri kitaplıklarının alpine inşa edilmesinin bu kadar uzun sürmesinin nedeni, bu kitaplıkların pip tekerleklerinin c / c ++ 'dan önceden derlenmiş ve glibcortak bir c standart kitaplık seti olan ikili dosyalar içermesidir . Debian, Fedora, CentOS hepsi (tipik olarak) kullanır glibc, ancak hafif kalmak için alp musl-libcyerine kullanır . Bir glibcsistem üzerine inşa edilen c / c ++ ikili dosyaları olmadan bir sistemde çalışmaz glibcve aynı şey için de geçerlidir musl.

Pip, önce doğru ikili dosyalara sahip bir tekerleği arar, eğer bulamazsa, ikili dosyaları c / c ++ kaynağından derlemeye çalışır ve onları musl'a bağlar. Çoğu durumda, python başlıklarına sahip değilseniz python3-devveya make.

Şimdi gümüş astar, diğerlerinin de belirttiği gibi, apktopluluk tarafından sağlanan uygun ikili dosyalara sahip paketler var , bunları kullanmak sizi ikili dosyaları (bazen uzun) oluşturma sürecinden kurtaracaktır.


5

Burada gerçekten dürüst bir tavsiye, Debian tabanlı imaja geçin ve sonra tüm problemleriniz ortadan kalkacaktır.

Alpine for python uygulamaları iyi çalışmıyor.

İşte benim 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

Bu python:3.7.6-busterdurumda daha uygun olanı, ayrıca işletim sisteminde ekstra bağımlılığa ihtiyacınız yoktur.

Yararlı ve yeni bir makaleyi takip edin: https://pythonspeed.com/articles/alpine-docker-python/ :

Python görüntüleri için Alpine Linux'u kullanmayın Çok daha yavaş derleme süreleri, daha büyük görüntüler, daha fazla çalışma ve belirsiz hatalar için potansiyel istemediğiniz sürece, temel görüntü olarak Alpine Linux'tan kaçınmak isteyeceksiniz. Ne kullanmanız gerektiğine dair bazı öneriler için, iyi bir temel görüntü seçme hakkındaki makaleme bakın.


1
Görüntünüzdeki katman sayısını azaltabilirsiniz, örn. RUN komutları bloğu kullanmak yerine RUN pip install <packegeA> && pip install <packageB> vb. Yapı performansınızı etkiler :)
p0l00ck

pip --no-cacheBiraz daha fazla ayak izini tıraş etmek için de kullanabilirsiniz . Gerçekten yapmanız gereken, onları satır satır bir requirements.txtdosyaya koymak vepip install --no-cache -r requirements.txt
ThisGuyCantEven

1

Bu benim için çalıştı:

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" ]

Burada kodun çoğu cevabı dan jtlz2 aynı iplik ve gelen Faylixe başka bir iş parçacığı.

Pandaların daha hafif sürümünün Alpine deposunda bulunduğu, py3-numpyancak Python'un varsayılan olarak içe aktarmaları okuduğu aynı dosya yoluna yüklenmediği ortaya çıktı. Bu nedenle ENV,. Alp versiyonu konusunda da dikkatli olun.


0

pandastopluluk destekli bir paket olarak kabul edilir, bu nedenle işaret eden yanıtlar edge/testingişe yaramayacaktır çünkü Alpine, pandaları bir çekirdek paket olarak resmi olarak desteklememektedir (hala çalışmaktadır, sadece ana Alp geliştiricileri tarafından desteklenmemektedir).

Bu Dockerfile'ı deneyin:

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

Bu, vanilya Alpine görüntüsü için de geçerlidir FROM alpine:3.12.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.