63

In my docker file, I want to install med2image python package (https://github.com/FNNDSC/med2image). I use the following code:

FROM ubuntu:16.04
RUN apt-get update && apt-get install -y --no-install-recommends \
    python3.5 \
    python3-pip \
    && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN pip install nibabel pydicom matplotlib pillow
RUN pip install med2image

But I get the following error when I want to build the image:

Downloading https://files.pythonhosted.org/packages/6f/e5/948b023c7feb72adf7dfb26d90a13c838737bbf52be704f5ddd0878e3264/med2image-1.1.2.tar.gz
Complete output from command python setup.py egg_info:
Sorry, only Python 3.5+ is supported.

----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in  /tmp/pip-install-FnNb_S/med2image/
The command '/bin/sh -c pip install med2image' returned a non-zero code: 1

What should I do?!

2

4 Answers 4

89

Recommended base image

As suggested in my comment, you could write a Dockerfile that looks like:

FROM python:3

RUN pip install --no-cache-dir --upgrade pip && \
    pip install --no-cache-dir nibabel pydicom matplotlib pillow med2image
    # Note: we had to merge the two "pip install" package lists here, otherwise
    # the last "pip install" command in the OP may break dependency resolution…

CMD ["cat", "/etc/os-release"]

And the command example above could confirm at runtime (docker build --pull -t test . && docker run --rm -it test) that this image is based on the GNU/Linux distribution "Debian stable".

Generic Dockerfile template

Finally to give a comprehensive answer, note that a good practice regarding Python dependencies consists in specifying them in a declarative way in a dedicated text file (in alphabetical order, to ease review and update) so that for your example, you may want to write the following file:

requirements.txt

matplotlib
med2image
nibabel
pillow
pydicom

and use the following generic Dockerfile

FROM python:3

WORKDIR /usr/src/app

COPY requirements.txt ./

RUN pip install --no-cache-dir --upgrade pip \
  && pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "./your-daemon-or-script.py"]

To be more precise, this is the approach suggested in the documentation of the Docker official image python, §. How to use this image

7
  • When RUN python -m pip install --upgrade pip is used, then does it re-use the same layer or does it create new layer (so effectively use upgrade)?
    – variable
    Commented May 14, 2020 at 11:15
  • 1
    (maybe python -m pip install --upgrade pip is unneeded, but) I confirm that the 2 commands concatenated with a && (RUN pip install --upgrade pip && pip install --no-cache-dir -r requirements.txt) do create a single layer. See also the SO question Purpose of specifying several UNIX commands in a single RUN instruction in Dockerfile
    – ErikMD
    Commented May 14, 2020 at 11:33
  • prefere a single pip install command or you might break dependency resolution
    – Gaetan
    Commented Sep 6, 2022 at 9:17
  • @Gaetan I guess you talk about theRUN command, but can you be more specific? which exact command would you recommend?
    – ErikMD
    Commented Sep 6, 2022 at 11:27
  • BTW AFAICT, pip and dependency resolution is not very robust: (independently of this Docker context) I often stumbled on a pip install command that went through successfully, unlike a subsequent pip check
    – ErikMD
    Commented Sep 6, 2022 at 11:28
46

Some of the other answers/comments are suggesting to change your base image but if you want to keep your ubuntu 16.04 you can also simply specify your version of pip/python to use pip3 or pip3.5 like shown below.

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y --no-install-recommends \
    python3.5 \
    python3-pip \
    && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN pip3 install nibabel pydicom matplotlib pillow
RUN pip3 install med2image
1
  • 1
    Is it possible to make the image smaller?
    – Jinyu Wu
    Commented Jan 23, 2020 at 22:56
5

Try pip3

RUN pip3 install nibabel pydicom matplotlib pillow
RUN pip3 install med2image
2

If you have Jupyter Notebook in your docker container, you can install any python package by running a new Terminal in Jupyter by clicking the button shown here:

button for terminal

and running: pip install <package-name>

The package stays in the docker container even after you exit the container.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.