25

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?

8 Answers 8

37

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Whoever is using this answer now, keep in mind pip3 will not work. Use python3 -m pip --no-cache-dir install --upgrade awscli instead. See: stackoverflow.com/a/49836753/6273492
12

All the answers are about aws-cli version 1, If you want version 2 try the below

FROM node:lts-stretch-slim

RUN apt-get update && \
    apt-get install -y \
        unzip \
        curl \
    && apt-get clean \
    && curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
    && unzip awscliv2.zip \
    && ./aws/install \
    && rm -rf \
        awscliv2.zip \
    && apt-get -y purge curl \
    && apt-get -y purge unzip 

CMD ["/bin/bash"]

1 Comment

That's very clear.
5

As you have correctly stated, pip installing on the docker image you are using is an older one not supporting --no-cache-dir. You can try updating that or you can also fix the second problem which is about missing python source headers. This can be fixed by installing python-dev package. Just add that to the list of packages installed in the Dockerfile:

FROM library/node:6.11.2

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

CMD ["/bin/bash"]

You can then run aws which should be on your path.

1 Comment

This gives an alarming number (dozens) of warnings (or errors?) though on building the image, aren't those releveant then?
5

Your image is based on Debian Jessie, so you are installing Python 2.7. Try using Python 3.x:

apt-get install -y python3-pip
pip3 install awscli

4 Comments

Thx for the response, but I could not get this to work. Could you show me how my Dockerfile should be updated? I've tried several variations, including replacing "python" with "python3" (and "pip" with "pip3") everywhere in my file but the error persists...
This builds without any problem: pastebin.com/LPPJfgry Are you sure you see error messages? PyYAML will output a lot of compiler code, but Docker will build the image eventually without any errors. I'm using Docker version 17.06.0-ce, build 02c1d87.
Your pastebin however diverges from my question as well as your answer though? It contains a python3-dev line (that is not in your answer, but it is in the other answer), and you've removed my --no-cache-dir directive. With only the changes you've mentioned in your answer (and thus keeping that directive which I would like to keep) things won't work. pastebin.com/UwyY53Pv
Thx again for your suggestion though, with some adjustments I got it to work.
0

Install AWS CLI in docker container using below command:

apt upgrade -y;apt update;apt install python3 python3-pip python3-setuptools -y; python3 -m pip --no-cache-dir install --upgrade awscli

To check the assumed role or AWS identity run below command:

aws sts get-caller-identity

Comments

0

Using FROM node:18-alpine; Update your packages then install the required packages before building you dependencies with:

RUN apk --no-cache add --virtual builds-deps build-base python3

I then upgraded pip before installing the AWS CLI

RUN pip install --upgrade pip && \ pip install --upgrade awscli.

Here is the fullcode:

## Install required packages for awsebcli ##
RUN apk update && apk add --update --no-cache \
    git \
    bash \
    curl \
    openssh \
    python3 \
    py3-pip \
    py-cryptography \
    wget \
    curl

RUN apk --no-cache add --virtual builds-deps build-base python3
RUN pip install --upgrade pip && \
    pip install --upgrade awscli

Credit goes to metacollective9

Comments

0
apk add --no-cache curl jq python3 py3-pip
pip install awscli

was working perfect for us until last week, we had :

error: externally-managed-environment
× This environment is externally managed
╰─> 
The system-wide python installation should be maintained using the system
package manager (apk) only.

If the package in question is not packaged already (and hence installable via
"apk add py3-somepackage"), please consider installing it inside a virtual
environment

the solution proposed, worked perfect :

apk add --no-cache curl jq python3 py3-pip
python3 -m venv /path/to/venv
. /path/to/venv/bin/activate
pip install awscli

Comments

0

If you are using an alpine base image, I recommend adding this to your Dockerfile:

RUN apk add --no-cache aws-cli

See https://github.com/aws/aws-cli/issues/4971#issuecomment-1784175703

Comments

Your Answer

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.