7

I am trying to build a custom Docker image based on Ubuntu 18.04. Ubuntu comes loaded with Python 3.6 but I want to 1.) install Python 3.7, 2.) make it the default Python version (so it can be called with python instead of python3.7, and 3.) install pip. When I run docker build, it fails to reload ~/.bashrc, and thus python is not an alias for python3.7. How can I resolve this issue?

FROM ubuntu:18.04

# Set temp work directory
# for package configuration
WORKDIR /usr/src/cache

# Update apt packages
RUN apt update
RUN apt upgrade -y

# Install vim
RUN apt install vim -y

# Install python 3.7
RUN apt install software-properties-common -y
RUN add-apt-repository ppa:deadsnakes/ppa
RUN apt install python3.7 -y

# Make python 3.7 the default
RUN echo "alias python=python3.7" >> ~/.bashrc
RUN export PATH=${PATH}:/usr/bin/python3.7
RUN /bin/bash -c "source ~/.bashrc"

# Install pip
RUN apt install python3-pip -y
RUN python -m pip install --upgrade pip

# Install lsof
RUN apt install lsof

# Install ta-lib
# Source: https://medium.com/@artiya4u/installing-ta-lib-on-ubuntu-944d8ca24eae
RUN apt install build-essential wget -y
RUN wget https://artiya4u.keybase.pub/TA-lib/ta-lib-0.4.0-src.tar.gz
RUN tar -xvf ta-lib-0.4.0-src.tar.gz
RUN /bin/bash -c "cd ta-lib/; ./configure --prefix=/usr; make; make install"

# Install pip packages
COPY requirements.txt ./
RUN pip install -r requirements.txt

# Set working directory for code
WORKDIR /usr/src/app

Output when running docker build:

Step 1/20 : FROM ubuntu:18.04
 ---> c3c304cb4f22
Step 2/20 : WORKDIR /usr/src/cache
 ---> Using cache
 ---> 6bab8662b50a
Step 3/20 : RUN apt update
 ---> Using cache
 ---> 4d3bc75e5b24
Step 4/20 : RUN apt upgrade -y
 ---> Using cache
 ---> 24a93e9b2518
Step 5/20 : RUN apt install software-properties-common -y
 ---> Using cache
 ---> 077ead1bcb54
Step 6/20 : RUN add-apt-repository ppa:deadsnakes/ppa
 ---> Using cache
 ---> 7771a6ac7068
Step 7/20 : RUN apt install python3.7 -y
 ---> Using cache
 ---> 5f57462b0444
Step 8/20 : RUN echo "alias python=python3.7" >> ~/.bashrc
 ---> Running in c31352b84ecd
Removing intermediate container c31352b84ecd
 ---> c1060eaa66b8
Step 9/20 : RUN export PATH=${PATH}:/usr/bin/python3.7
 ---> Running in 5de52797c355
Removing intermediate container 5de52797c355
 ---> 2a9eb6215da8
Step 10/20 : RUN /bin/bash -c "source ~/.bashrc"
 ---> Running in cde1dd943e21
Removing intermediate container cde1dd943e21
 ---> 99eae1743824
Step 11/20 : RUN apt install python3-pip -y
 ---> Running in 2dece67c9c40

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Reading package lists...
Building dependency tree...
Reading state information...
........[OMITTING SOME OUTPUT].......
Setting up build-essential (12.4ubuntu1) ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Removing intermediate container 2dece67c9c40
 ---> 34c1ecded3f2
Step 12/20 : RUN python -m pip install --upgrade pip
 ---> Running in 32ffece96844
/bin/sh: 1: python: not found
The command '/bin/sh -c python -m pip install --upgrade pip' returned a non-zero code: 127
j_dev
  • 191
  • 1
  • 2
  • 11
  • Does this answer your question? [Install pip in docker](https://stackoverflow.com/questions/36611052/install-pip-in-docker) – Yagiz Degirmenci Apr 22 '20 at 18:03
  • 1
    Can you use the stock `python:3.7` image, rather than building your own? – David Maze Apr 22 '20 at 18:44
  • What is the exact error with which the build fails (while running `~/.bashrc`)? – nitishagar Apr 22 '20 at 20:10
  • @DavidMaze I am okay with using a stock image but ideally, I would like to be able to install packages via apt. I do not believe that is feasible with the alpine-python images on Docker Hub. – j_dev Apr 25 '20 at 07:37
  • @yagizcandegirmenci Unfortunately, the linked issue does not. – j_dev Apr 25 '20 at 07:38
  • @nitishagar I have provided the output of running docker build. Thank you all for your help! – j_dev Apr 25 '20 at 07:39
  • The [Docker Hub `python` image](https://hub.docker.com/_/python/) has both Debian and Alpine variants, so if you specifically want to use Debian's APT, that's a choice. – David Maze Apr 25 '20 at 11:14

1 Answers1

7

Python3.7 can be set as the default python using update-alternatives. After the commands to install python3.7 in the docker file, add:

# Add 3.7 to the available alternatives
RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.7 1

# Set python3.7 as the default python
RUN update-alternatives --set python /usr/bin/python3.7

If you need python3 to point at 3.7 as well, then replace /usr/bin/python and python in the above calls with /usr/bin/python3 and python3.

kmt
  • 773
  • 12
  • 30