在openjdk:7-jre-alpine docker上如何安装Python 3.6

7

直到一周前,我还在像这样的Java镜像中成功地使用Python 3.6脚本:

FROM openjdk:7-jre-alpine

RUN apk update \
    && apk upgrade \
    && apk add --no-cache bash \
    && apk add --no-cache --virtual=build-dependencies unzip \
    && apk add --no-cache curl \
    && apk add --no-cache go

RUN apk add --no-cache python3 && \
    python3 -m ensurepip && \
    rm -r /usr/lib/python*/ensurepip && \
    pip3 install --upgrade pip setuptools && \
    if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi && \
    if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 
/usr/bin/python; fi && \
    rm -r /root/.cache && \
    pip install kubernetes

现在这个Dockerfile在该行失败

&& apk add --no-cache bash \

我找到的唯一解决方法就是将构建依赖项注释掉,并按以下方式进行:

    && echo -e "http://nl.alpinelinux.org/alpine/v3.5/main\nhttp://nl.alpinelinux.org/alpine/v3.5/community" > /etc/apk/repositories \
&& apk add --no-cache bash \
#&& apk add --no-cache --virtual=build-dependencies unzip \

此修复安装的是Python 3.52版本,而不是3.6版本。

我该如何在openjdk:7-jre-alpine docker上安装Python 3.6 [或其他我想要的版本]?

更新: 现在所有的alpine选项都失败了。

3个回答

7
经过几个小时的努力,我尝试了许多不同的选项,包括在多个版本中重新安装 docker。最终,我设法让下面的 Dockefile 工作起来。请注意,我不得不重复构建几次。我的理论是我的 WIFI、网络或 VPN 导致了超时。在我的 Mac 的本地 docker 仓库成功构建后,我尝试在 virtualbox vm 上的 minikube 上进行相同的构建,在重复相同的构建并注意到错误发生在脚本更远处后它成功了。
以下是 Dockerfile:
FROM alpine:3.7

RUN apk update \
&& apk upgrade \
&& apk add --no-cache bash \
&& apk add --no-cache --virtual=build-dependencies unzip \
&& apk add --no-cache curl \
&& apk add --no-cache openjdk7-jre

RUN apk add --no-cache python3 \
&& python3 -m ensurepip \
&& pip3 install --upgrade pip setuptools \
&& rm -r /usr/lib/python*/ensurepip && \
if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi && \
if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/bin/python; fi && \
rm -r /root/.cache


RUN pip install kubernetes

2
这个 Dockerfile 似乎在 openjdk 镜像上安装了 Python 3.6.5。
FROM openjdk:7-jre-alpine
# ensure local python is preferred over distribution python
ENV PATH /usr/local/bin:$PATH

# http://bugs.python.org/issue19846
# > At the moment, setting "LANG=C" on a Linux system *fundamentally breaks Python 3*, and that's not OK.
ENV LANG C.UTF-8

# install ca-certificates so that HTTPS works consistently
# the other runtime dependencies for Python are installed later
RUN apk add --no-cache ca-certificates

ENV GPG_KEY 0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D
ENV PYTHON_VERSION 3.6.5

RUN set -ex \
    && apk add --no-cache --virtual .fetch-deps \
        gnupg \
        libressl \
        tar \
        xz \
    \
    && wget -O python.tar.xz "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz" \
    && wget -O python.tar.xz.asc "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc" \
    && export GNUPGHOME="$(mktemp -d)" \
    && rm -rf "$GNUPGHOME" python.tar.xz.asc \
    && mkdir -p /usr/src/python \
    && tar -xJC /usr/src/python --strip-components=1 -f python.tar.xz \
    && rm python.tar.xz \
    \
    && apk add --no-cache --virtual .build-deps  \
        bzip2-dev \
        coreutils \
        dpkg-dev dpkg \
        expat-dev \
        gcc \
        gdbm-dev \
        libc-dev \
        libffi-dev \
        libnsl-dev \
        libtirpc-dev \
        linux-headers \
        make \
        ncurses-dev \
        libressl \
        libressl-dev \
        pax-utils \
        readline-dev \
        sqlite-dev \
        tcl-dev \
        tk \
        tk-dev \
        xz-dev \
        zlib-dev \
# add build deps before removing fetch deps in case there's overlap
    && apk del .fetch-deps \
    \
    && cd /usr/src/python \
    && gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" \
    && ./configure \
        --build="$gnuArch" \
        --enable-loadable-sqlite-extensions \
        --enable-shared \
        --with-system-expat \
        --with-system-ffi \
        --without-ensurepip \
    && make -j "$(nproc)" \
# set thread stack size to 1MB so we don't segfault before we hit sys.getrecursionlimit()
# https://github.com/alpinelinux/aports/commit/2026e1259422d4e0cf92391ca2d3844356c649d0
        EXTRA_CFLAGS="-DTHREAD_STACK_SIZE=0x100000" \
    && make install \
    \
    && runDeps="$( \
        scanelf --needed --nobanner --format '%n#p' --recursive /usr/local \
            | tr ',' '\n' \
            | sort -u \
            | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
    )" \
    && apk add --virtual .python-rundeps $runDeps \
    && apk del .build-deps \
    \
    && find /usr/local -depth \
        \( \
            \( -type d -a \( -name test -o -name tests \) \) \
            -o \
            \( -type f -a \( -name '*.pyc' -o -name '*.pyo' \) \) \
        \) -exec rm -rf '{}' + \
    && rm -rf /usr/src/python

# make some useful symlinks that are expected to exist
RUN cd /usr/local/bin \
    && ln -s idle3 idle \
    && ln -s pydoc3 pydoc \
    && ln -s python3 python \
    && ln -s python3-config python-config

# if this is called "PIP_VERSION", pip explodes with "ValueError: invalid truth value '<VERSION>'"
ENV PYTHON_PIP_VERSION 10.0.1

RUN set -ex; \
    \
    apk add --no-cache --virtual .fetch-deps libressl; \
    \
    wget -O get-pip.py 'https://bootstrap.pypa.io/get-pip.py'; \
    \
    apk del .fetch-deps; \
    \
    python get-pip.py \
        --disable-pip-version-check \
        --no-cache-dir \
        "pip==$PYTHON_PIP_VERSION" \
    ; \
    pip --version; \
    \
    find /usr/local -depth \
        \( \
            \( -type d -a \( -name test -o -name tests \) \) \
            -o \
            \( -type f -a \( -name '*.pyc' -o -name '*.pyo' \) \) \
        \) -exec rm -rf '{}' +; \
    rm -f get-pip.py

我从这里复制粘贴了Python 3.6 Alpine镜像,但不得不删除第33-34行,因为它们是有问题的。如果你要在生产中使用,请考虑这一点。 祝愉快的Python编程。


它出现了一个错误,也许是我升级后的Docker安装有问题。 - Rubber Duck
你在哪个环境下运行它?我正在使用 Docker for Mac 版本 - 18.03.0-ce-mac60。 - Yaron Idan
目前在 Mac 上使用的是 18.03.0-ce 版本。我已经重新安装了所有组件 [virtualbox、minikube] 并在虚拟机中测试了 Docker。 - Rubber Duck
安装ncurses-terminfo (6.0_p20171125-r0) 错误:无法创建usr/share/terminfo/a/avt-w-rv:没有错误信息 错误:ncurses-terminfo-6.0_p20171125-r0:签名错误 安装ncurses-libs (6.0_p20171125-r0) 安装readline (7.0.003-r0) 安装bash (4.4.19-r1) 执行bash-4.4.19-r1.post-install 执行busybox-1.27.2-r8.trigger 16个软件包中有1个错误,总共安装了6 MiB - Rubber Duck
安装Python3(3.6.3-r9) 错误:无法创建usr/bin/pyvenv-3.6:没有错误信息 错误:python3-3.6.3-r9:签名错误 - Rubber Duck
显示剩余11条评论

0
ENV PYTHONUNBUFFERED=1

RUN echo "**** install Python ****" && \
    apk add --no-cache python3 && \
    if [ ! -e /usr/bin/python ]; then ln -sf python3 /usr/bin/python ; fi && \
    \
    echo "**** install pip ****" && \
    python3 -m ensurepip && \
    rm -r /usr/lib/python*/ensurepip && \
    pip3 install --no-cache --upgrade pip setuptools wheel && \
    if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi

源代码,https://github.com/Docker-Hub-frolvlad/docker-alpine-python3/blob/master/Dockerfile


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接