Search code examples
pythonamazon-web-servicesdockerpip

How to install awscli using pip in library/node Docker image


I'm trying to install awscli using pip (as per Amazon's recommendations) in a custom Docker image that comes FROM library/node:6.11.2. Here's a repro:

FROM library/node:6.11.2

RUN apt-get update && \
    apt-get install -y \
        python \
        python-pip \
        python-setuptools \
        groff \
        less \
    && pip --no-cache-dir install --upgrade awscli \
    && apt-get clean

CMD ["/bin/bash"]

However, with the above I'm met with:

no such option: --no-cache-dir

Presumably because I've got incorrect versions of Python and/or Pip?

I'm installing Python, Pip, and awscli in a similar way with FROM maven:3.5.0-jdk-8 and there it works just fine. I'm unsure what the relevant differences between the two images are.

Removing said option from my Dockerfile doesn't do me much good either, because then I'm met with a big pile of different errors, an excerpt here:

Installing collected packages: awscli, PyYAML, docutils, rsa, colorama, botocore, s3transfer, pyasn1, jmespath, python-dateutil, futures, six
  Running setup.py install for PyYAML
    checking if libyaml is compilable
### ABBREVIATED ###
    ext/_yaml.c:4:20: fatal error: Python.h: No such file or directory
     #include "Python.h"
                        ^
    compilation terminated.
    error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
### ABBREVIATED ###

Bottom line: how do you properly install awscli in library/node:6.x based images?


Solution

  • Adding python-dev as per this other answer works, but throws an alarming number of compiler warnings (errors?), so I went with a variation of @SergeyKoralev's answer, which needed some tweaking before it worked.

    Here's the changes I needed to make this work:

    1. Change to python3 and pip3 everywhere.
    2. Add a statement to upgrade pip itself.
    3. Separate the awscli install in a separate RUN command.

    Here's a full repro that does seem to work:

    FROM library/node:6.11.2
    
    RUN apt-get update && \
        apt-get install -y \
            python3 \
            python3-pip \
            python3-setuptools \
            groff \
            less \
        && pip3 install --upgrade pip \
        && apt-get clean
    
    RUN pip3 --no-cache-dir install --upgrade awscli
    
    CMD ["/bin/bash"]
    

    You can probably also keep the aws install in the same RUN layer if you add a shell command before the install that refreshes things after upgrading pip. Not sure how though.