Почему pyenv не находит общие библиотеки openssl в Alpine Linux?

Я пытаюсь создать образ докера из gliderlabs/alpine:latest содержащий только pyenv и его зависимости. Я хотел бы, чтобы этот контейнер мог устанавливать и запускать произвольный интерпретатор через pyenv.

Начальная попытка

Я начал со следующего Dockerfile:

FROM gliderlabs/alpine:latest

RUN apk-install curl \
  ca-certificates \
  bash \
  git \
  openssl-dev \
  readline-dev \
  bzip2-dev \
  sqlite-dev \
  build-base

RUN curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer -o /pyenv-installer
RUN touch /root/.bashrc && \
      /bin/ln -s /root/.bashrc /root/.bash_profile && \
      /bin/bash /pyenv-installer && \
      rm /pyenv-installer && \
      echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile && \
      echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile && \
      echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

ENV HOME  /root
ENV PYENV_ROOT $HOME/.pyenv
ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH

Ошибка

После сборки я могу запустить контейнер и запустить bash, а pyenv Команда доступна, как и ожидалось.

Тем не менее, когда я пытаюсь запустить pyenv install 3.4.3 Я получаю следующую ошибку:

bash-4.3# pyenv install 3.4.3
Downloading Python-3.4.3.tgz...
-> https://yyuu.github.io/pythons/4281ff86778db65892c05151d5de738d
Installing Python-3.4.3...
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/yyuu/pyenv/wiki/Common-build-problems


BUILD FAILED (Alpine Linux 3.2.3 using python-build 20151006)

Inspect or clean up the working tree at /tmp/python-build.20151006155321.99
Results logged to /tmp/python-build.20151006155321.99.log

Last 10 log lines:
(cd /root/.pyenv/versions/3.4.3/share/man/man1; ln -s python3.4.1 python3.1)
if test "xupgrade" != "xno"  ; then \
    case upgrade in \
        upgrade) ensurepip="--upgrade" ;; \
        install|*) ensurepip="" ;; \
    esac; \
     ./python -E -m ensurepip \
        $ensurepip --root=/ ; \
fi
Ignoring ensurepip failure: pip 6.0.8 requires SSL/TLS

Попытка исправить

После небольшого поиска я нашел эту страницу, которая для OSX/homebrew предлагает следующее исправление:

CFLAGS="-I$(brew --prefix openssl)/include"
LDFLAGS="-L$(brew --prefix openssl)/lib"

Поскольку я не использую OSX или Homebrew, я попытался адаптировать эти команды к среде Alpine, добавив следующие строки в Dockerfile:

ENV CFLAGS '-I/usr/include'
ENV LDFLAGS '-L/usr/lib'

Обратите внимание, что /usr/lib содержит:

  • libssl.a
  • libssl.so
  • libssl.so.1.0.0

а также /usr/include содержит openssl, При этом, похоже, что модификация никак не влияет на мою ошибку при установке Python 3.4.3.

Вопрос

Как я могу получить pyenv для установки среды python под докеризированным Alpine Linux?

Редактировать:

  1. Журнал сборки pyenv явно задыхается, потому что sockaddr_can тип не определен. Я официально потерян. Это musl ошибка?

2 ответа

Решение

Проблема была связана с musl не найти общие заголовки Linux. Решение заключается в установке linux-headers,

Ниже приведен минимальный рабочий Dockerfile:

FROM gliderlabs/alpine:latest

RUN apk-install curl \
      ca-certificates \
      bash \
      git \
      openssl-dev \
      readline-dev \
      bzip2-dev \
      sqlite-dev \
      ncurses-dev \
      linux-headers \
      build-base

RUN curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer -o /pyenv-installer && \
      touch /root/.bashrc && \
      /bin/ln -s /root/.bashrc /root/.bash_profile && \
      /bin/bash /pyenv-installer && \
      rm /pyenv-installer && \
      echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile && \
      echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile && \
      echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

ENV HOME  /root
ENV PYENV_ROOT $HOME/.pyenv
ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH

Я предполагаю, что проблема здесь в том, что у вас нет заголовков, и вам нужно их установить.
Просто добавь apk add openssl-dev в ваш Dockerfile.

Попробуйте запустить pyenv doctor в своем контейнере и посмотрите, установлены ли все необходимые зависимости.
Также см. https://github.com/yyuu/pyenv/wiki/Common-build-problems для необходимых пакетов и попробуйте найти правильные эквиваленты для Alpine Linux. Пока вы это делаете, добавьте их в документацию, чтобы другие могли их найти.

Другие вопросы по тегам