7

Up until about a week ago I was successfully using python 3.6 scripts on a java image like this:

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

now this dockerfile fails at the line

&& apk add --no-cache bash \

And the only solution I found was to comment out the build dependancies and bring them thus:

    && 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 \

This fix installs python version 3.52 instead of 3.6

How do I install python 3.6 [or any version I want] on openjdk:7-jre-alpine docker?

Update: Now all the alpine options are failing

Yaron Idan
  • 6,207
  • 5
  • 44
  • 66
Rubber Duck
  • 3,673
  • 3
  • 40
  • 59

3 Answers3

7

After spending a few hours trying many different options including reinstalling docker in more than one version. I managed to get the Dockefile below to work. Note that I had to repeat the build a few times. My theory is that my WIFI or network or VPN were causing timeouts. After a successful build on my mac's local docker repo I attempted the same on minikube with virtualbox vm and it worked after repeating the same build a few times and noticing the errors happened further along the script.

Here is the Dockerfile for what it's worth:

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
Rubber Duck
  • 3,673
  • 3
  • 40
  • 59
2

This Dockerfile seems to install python 3.6.5 on top of the openjdk image.

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

I copy-pasted the python 3.6 alpine image from here but had to remove lines 33-34 as they were broken. Take that into account if you're gonna use that in production. Happy pythoning.

Yaron Idan
  • 6,207
  • 5
  • 44
  • 66
  • It's giving an error, perhaps there is something wrong with my docker installation after an upgrade – Rubber Duck Apr 22 '18 at 11:14
  • What environment are you running it on? I'm using docker for mac version - 18.03.0-ce-mac60 – Yaron Idan Apr 22 '18 at 12:50
  • right now 18.03.0-ce on mac. I've been reinstalling all components [virtualbox, minikube] and testing with docker and in vm, – Rubber Duck Apr 22 '18 at 14:08
  • Just tried again, this time on an ubuntu machine running 17.12.1-ce, seems to work fine. Perhaps you can try that since you will probably end up running your container on a linux machine eventually, no? – Yaron Idan Apr 22 '18 at 17:03
  • virtualbox minikube is linux – Rubber Duck Apr 22 '18 at 18:50
  • there must be something fishy with my setup – Rubber Duck Apr 22 '18 at 18:53
  • Wanna share the error with me and I'll see if it rings any bells? – Yaron Idan Apr 22 '18 at 18:54
  • It seems that I needed to rebuild the image a few times and slowly the dependancies downloaded and the error came later until the image was built successfully. It must have been timeouts due to poor connection or VPN. The process was a bit faster on the mac repo compared to minikube. – Rubber Duck Apr 22 '18 at 19:51
  • ERROR: ncurses-terminfo-6.0_p20171125-r0: BAD signature (5/6) Installing readline (7.0.003-r0) (6/6) Installing bash (4.4.19-r1) Executing bash-4.4.19-r1.post-install Executing busybox-1.27.2-r8.trigger 1 error; 6 MiB in 16 packages – Rubber Duck Apr 22 '18 at 19:53
  • (3/6) Installing ncurses-terminfo (6.0_p20171125-r0) ERROR: Failed to create usr/share/terminfo/a/avt-w-rv: No error information ERROR: ncurses-terminfo-6.0_p20171125-r0: BAD signature (4/6) Installing ncurses-libs (6.0_p20171125-r0) (5/6) Installing readline (7.0.003-r0) (6/6) Installing bash (4.4.19-r1) Executing bash-4.4.19-r1.post-install Executing busybox-1.27.2-r8.trigger 1 error; 6 MiB in 16 packages – Rubber Duck Apr 22 '18 at 19:53
  • (4/4) Installing python3 (3.6.3-r9) ERROR: Failed to create usr/bin/pyvenv-3.6: No error information ERROR: python3-3.6.3-r9: BAD signature – Rubber Duck Apr 22 '18 at 19:54
  • these are results of retries – Rubber Duck Apr 22 '18 at 19:56
  • Well, these errors are truly peculiar, but if the build ends up succeeding I guess those are really network issues. Do you mind marking the answer as correct, since you say you ended up successfully building the image? – Yaron Idan Apr 25 '18 at 06:38
  • I marked it. though I haven't tested. I trust you did – Rubber Duck Apr 25 '18 at 06:44
  • Thanks, I did test it and it worked well. I know it's neat picking but I meant accepting the answer and not upvoting it. You may also accept your own answer if you find it more accurate but having the question answered will provide help for whoever runs into this issue in the future. – Yaron Idan Apr 25 '18 at 10:16
  • I would choose mine because it's more run of the mill – Rubber Duck Apr 25 '18 at 11:30
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

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

Husein Zolkepli
  • 11
  • 1
  • 1
  • 2