为什么 pyenv 在 Alpine Linux 下找不到 openssl 共享库?
Why isn't pyenv finding openssl shared libraries under Alpine Linux?
我正在尝试从 gliderlabs/alpine:latest
构建一个 docker 映像,其中仅包含 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
已尝试修复
经过一些谷歌搜索后,我找到了 this 页面,对于 OSX/homebrew,该页面建议进行以下修复:
CFLAGS="-I$(brew --prefix openssl)/include"
LDFLAGS="-L$(brew --prefix openssl)/lib"
由于我没有使用 OSX 或 Homebrew,我试图通过将以下行添加到 Dockerfile 来使这些命令适应 Alpine 环境:
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 在 dockerized Alpine Linux 下安装 python 环境?
编辑:
- pyenv build log 显然令人窒息,因为
sockaddr_can
类型未定义。我正式迷路了。这是 musl
错误吗?
我猜这里的问题是你没有 headers 而你需要安装它们。
只需将 apk add openssl-dev
添加到您的 Dockerfile。
在您的容器中尝试 运行 pyenv doctor,看看您是否安装了所有必需的依赖项。
另请参阅 https://github.com/yyuu/pyenv/wiki/Common-build-problems#requirements 以获取所需的软件包,并尝试为 Alpine Linux 找到合适的等价物。当您使用它时,将它们添加到文档中,以便其他人能够找到它。
问题与 musl
找不到通用 linux headers 有关。解决方法是安装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
我正在尝试从 gliderlabs/alpine:latest
构建一个 docker 映像,其中仅包含 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
已尝试修复
经过一些谷歌搜索后,我找到了 this 页面,对于 OSX/homebrew,该页面建议进行以下修复:
CFLAGS="-I$(brew --prefix openssl)/include"
LDFLAGS="-L$(brew --prefix openssl)/lib"
由于我没有使用 OSX 或 Homebrew,我试图通过将以下行添加到 Dockerfile 来使这些命令适应 Alpine 环境:
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 在 dockerized Alpine Linux 下安装 python 环境?
编辑:
- pyenv build log 显然令人窒息,因为
sockaddr_can
类型未定义。我正式迷路了。这是musl
错误吗?
我猜这里的问题是你没有 headers 而你需要安装它们。
只需将 apk add openssl-dev
添加到您的 Dockerfile。
在您的容器中尝试 运行 pyenv doctor,看看您是否安装了所有必需的依赖项。
另请参阅 https://github.com/yyuu/pyenv/wiki/Common-build-problems#requirements 以获取所需的软件包,并尝试为 Alpine Linux 找到合适的等价物。当您使用它时,将它们添加到文档中,以便其他人能够找到它。
问题与 musl
找不到通用 linux headers 有关。解决方法是安装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