How to install AWS CLI in docker container based on image "python:2.7"

17,415

Solution 1

You have two options here.

The first is to explicitly put the root user's local bin on the PATH with something like

ENV PATH=/root/.local/bin:$PATH

The second is to drop the --user argument on your pip install. By default, pip should write to /usr/local/bin which will be on your PATH already

Solution 2

In case you just need aws on your CI server:

FROM python:alpine

ARG CLI_VERSION=1.16.310

RUN pip install --no-cache-dir awscli==$CLI_VERSION && \
    mkdir /root/.aws

VOLUME /root/.aws/

ENTRYPOINT ["/usr/local/bin/aws"]

Build and tag as aws:

docker build -t aws .

Which can be used in this way:

docker run --rm -v /root/aws-cli/.aws:/root/.aws -ti aws ecr get-login --no-include-email --region us-west-2

Or:

docker run --rm -e  AWS_ACCESS_KEY_ID=AKIABCDEFGHIJKLMONP -e "AWS_SECRET_ACCESS_KEY=abcdefghijklmnopqrstvwxyz" -ti aws ecr get-login --no-include-email --region us-west-2
Share:
17,415
Saqib Ali
Author by

Saqib Ali

Updated on June 18, 2022

Comments

  • Saqib Ali
    Saqib Ali almost 2 years

    I have a dockerfile that looks like this:

    FROM python:2.7
    RUN pip install awscli --upgrade --user
    

    Once the docker image is built from this dockerfile, I run it. But when I get into the container and try to run the AWS CLI, it can't find it, because it is not in the PATH environment variable:

    $ docker exec -ti ec4934370e37 /bin/bash
    
    root@ec4934370e37:~# aws
    bash: aws: command not found
    
    root@ec4934370e37:/# find / -name aws
    /root/.local/bin/aws
    
    root@ec4934370e37:/# /root/.local/bin/aws --version
    aws-cli/1.15.81 Python/2.7.15 Linux/4.9.87-linuxkit-aufs botocore/1.10.80
    
    root@ec4934370e37:/# env | grep PATH
    PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    

    What is the best/easiest/least-hacky way to make sure that the AWSCLI is usable by being included in the PATH variable? Can this be done from inside the dockerfile itself?