94

I'm installing aws-cli on a docker swarm manager node running alpine (Linux 0317632a4ad9 4.9.59-moby #1 SMP Thu Mar 1 20:54:00 UTC 2018 x86_64 Linux). The aws-cli package for Alpine is currently listed in the community repo on the edge branch (1.18.55.r0). I modified /etc/apk/repositories to target this repo.

The install blew up looking for py3-urllib3, but I got around that and finally got a clean install with no errors, as below:

  ~ $ sudo apk add aws-cli@edge-comm
    fetch http://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
    ERROR: unsatisfiable constraints:
      py3-urllib3-1.25.9-r0:
        masked in: @edge
        satisfies: py3-botocore-1.16.12-r0[py3-urllib3<1.26]

    ~ $ sudo apk add py3-urllib3@edge aws-cli@edge-comm
    (1/23) Installing groff (1.22.3-r1)
    (2/23) Installing py3-six (1.10.0-r6)
    (3/23) Installing py3-dateutil (2.6.0-r1)
    (4/23) Installing libpng (1.6.37-r0)
    (5/23) Installing freetype (2.7.1-r2)
    (6/23) Installing libjpeg-turbo (1.5.3-r2)
    (7/23) Installing lcms2 (2.8-r1)
    (8/23) Installing openjpeg (2.3.0-r2)
    (9/23) Installing tiff (4.0.10-r0)
    (10/23) Installing libwebp (0.6.0-r0)
    (11/23) Installing py3-pillow (4.1.0-r0)
    (12/23) Installing py3-roman (2.0.0-r2)
    (13/23) Installing py3-docutils (0.13.1-r0)
    (14/23) Installing py3-jmespath@edge-comm (0.9.5-r0)
    (15/23) Installing py3-urllib3@edge (1.25.9-r0)
    (16/23) Installing py3-botocore@edge-comm (1.16.12-r0)
    (17/23) Installing py3-s3transfer@edge-comm (0.3.3-r0)
    (18/23) Installing py3-colorama@edge-comm (0.4.3-r0)
    (19/23) Installing yaml (0.1.7-r0)
    (20/23) Installing py3-yaml (3.12-r1)
    (21/23) Installing py3-asn1 (0.2.3-r0)
    (22/23) Installing py3-rsa (3.4.2-r1)
    (23/23) Installing aws-cli@edge-comm (1.18.55-r0)
    Executing busybox-1.26.2-r11.trigger
    OK: 576 MiB in 81 packages

The binary is created at /usr/bin/aws, but crashes looking for an awscli module:

~ $ aws
Traceback (most recent call last):
  File "/usr/bin/aws", line 19, in <module>
    import awscli.clidriver
ModuleNotFoundError: No module named 'awscli'

Thanks!

HieroB
  • 3,917
  • 4
  • 17
  • 22
  • can you share your base image? – Adiii May 22 '20 at 13:27
  • Thanks Adiii, it's the Docker-for-AWS image, but as you mention it, I think mine may be out of date. Meanwhile, I found a solution that doesn't use aws-cli so I no longer need to pursue this. (https://stackoverflow.com/questions/61902349/how-do-i-get-a-docker-swarm-manager-to-pull-images-from-aws-ecr-using-iam-role-p) – HieroB May 24 '20 at 10:11
  • 2
    There must be something wrong with the Docker-for-AWS image. It works in a docker container though: `docker run --rm -it alpine:3.13 sh -xc 'apk add aws-cli && aws --version'`. – x-yuri Mar 26 '21 at 13:09

13 Answers13

155

We have aws-cli Alpine package now. So you can just run

apk add --no-cache aws-cli
creemama
  • 6,559
  • 3
  • 21
  • 26
Dr.Crazy
  • 1,623
  • 1
  • 7
  • 8
141

For anybody who googles this, I've been using the image node:12.16.1-alpine.

RUN apk add --no-cache \
        python3 \
        py3-pip \
    && pip3 install --upgrade pip \
    && pip3 install --no-cache-dir \
        awscli \
    && rm -rf /var/cache/apk/*

RUN aws --version   # Just to make sure its installed alright

# Should output aws-cli/1.18.69 etc.

Worked fine for me.

NOTE: apk --no-cache and pip3 --no-cache-dir are used to keep the Docker image lean by not retaining package cache.

Shawn Barratt
  • 472
  • 3
  • 9
Rose
  • 2,619
  • 4
  • 20
  • 27
22

to expand and update upon @Rose (4317383) 's answer ( and get awscli version 2 ):

the regular pip3 packet ( pip3 install awscliv2 && awscliv2 -i ) presents the following errors due to musl / non-glibc alpine implementations:

Error relocating /root/.awscliv2/binaries/aws: __strcat_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __snprintf_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __vfprintf_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __strdup: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __stpcpy_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __vsnprintf_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __strncpy_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __strcpy_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __fprintf_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __strncat_chk: symbol not found

in doubt GLIBC is necessary , but if you are willing to invest ~100MB of space or you really need v2 , the following snippet would help

RUN apk --no-cache add \
    binutils \
    curl \
    && GLIBC_VER=$(curl -s https://api.github.com/repos/sgerrand/alpine-pkg-glibc/releases/latest | grep tag_name | cut -d : -f 2,3 | tr -d \",' ') \
    && curl -sL https://raw.githubusercontent.com/sgerrand/alpine-pkg-glibc/master/sgerrand.rsa.pub -o /etc/apk/keys/sgerrand.rsa.pub \
    && curl -sLO https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-${GLIBC_VER}.apk \
    && curl -sLO https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-bin-${GLIBC_VER}.apk \
    && apk add --no-cache \
    glibc-${GLIBC_VER}.apk \
    glibc-bin-${GLIBC_VER}.apk \
    && curl -sL https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip \
    && unzip awscliv2.zip \
    && aws/install \
    && rm -rf \
    awscliv2.zip \
    aws \
    /usr/local/aws-cli/v2/*/dist/aws_completer \
    /usr/local/aws-cli/v2/*/dist/awscli/data/ac.index \
    /usr/local/aws-cli/v2/*/dist/awscli/examples \
    && apk --no-cache del \
    binutils \
    curl \
    && rm glibc-${GLIBC_VER}.apk \
    && rm glibc-bin-${GLIBC_VER}.apk \
    && rm -rf /var/cache/apk/*

RUN awsv2 --version   # Just to make sure its installed alright

if your scripts do not break with awscliv2 named as awscli, you might add :

RUN ln -s $(which awscliv2) /usr/bin/aws
Bash Stack
  • 509
  • 3
  • 12
  • 1
    It worked! `aws-cli/2.2.4 Python/3.8.8 Linux/4.19.121-linuxkit exe/x86_64.alpine.3 prompt/off` – phyatt May 12 '21 at 18:55
  • `&& curl -sL https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -o /etc/apk/keys/sgerrand.rsa.pub \` for those who tries this. It didn't work for me, I still was getting these "symbols not found" using base image as `FROM praqma/network-multitool:extra` which is alpine based – DmitrySemenov Apr 21 '22 at 21:07
4
RUN apk update \
    && apk --no-cache add curl \
    && apk --no-cache add unzip \
    && curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
    && unzip awscliv2.zip \
    && ./aws/install   
Max Farsikov
  • 2,451
  • 19
  • 25
  • 14
    This solution doesn't work on Alpine without Glibc installed – Roman Shishkin May 07 '21 at 13:17
  • 1
    Might also consider removing awscliv2.zip once it's installed to save yourself some space. – Robert Smith Oct 13 '21 at 16:08
  • 4
    Regarding @roman-shishkin's comment `This solution doesn't work on Alpine without Glibc installed`... I ran into that problem. Although it appears to install successfully, I got the runtime error `aws: not found`. The fully working installation command is given by https://github.com/aws/aws-cli/issues/4685#issuecomment-615872019 – Vincent Yin Feb 08 '22 at 19:28
4

I've been using the image node:14-alpine

apk add --update --no-cache curl ca-certificates \
&& curl -sL -o /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \
&& curl -sL -o glibc-2.28-r0.apk https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk \
&& apk add glibc-2.28-r0.apk \
&& curl -sL -o glibc-bin-2.28-r0.apk https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-bin-2.28-r0.apk \
&& apk add glibc-bin-2.28-r0.apk \
&& curl -sL -o awscliv2.zip https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.0.30.zip \
&& unzip awscliv2.zip \
&& ./aws/install \
&& rm -Rf aws/ awscliv2.zip glibc-2.28-r0.apk glibc-bin-2.28-r0.apk \
&& aws --version
  • 1
    This is actually the only answer that works at the command line without needing to make a special image. Thank you! – Peter P. Jan 26 '23 at 02:16
1

Solution

Here's what you guys are looking for.

https://github.com/robertd/alpine-aws-cdk/blob/master/Dockerfile.v2

It works with Alpine and AWS CLI v2.

Credits for "Robert Djurasaj"

1

Yesterday, I spent quite some time to figure out how to build a slim aws-cli v2 image for ci pipelines (hence autocomplete and examples are removed) that does not suffer from the symbol not found problem.

After the glibc 2.35-r0 packages are installed, the symlink /lib64/ld-linux-x86-64.so.2 still points to the musl version of the library and not the glibc version. In glibc 2.34-r0 the symlink was replaced correctly, so I assume it is a bug in 2.35-r0.

This is my multi-staged Dockerfile to build an aws-cli 2.7.33 image:

FROM alpine:3.16.2 as base
ENV GLIBC_VER=2.35-r0

RUN set euo pipefail; \
    apk --no-cache add curl; \
    curl --silent --location https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub --output /etc/apk/keys/sgerrand.rsa.pub; \
    curl --silent --location --remote-name https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-${GLIBC_VER}.apk; \
    curl --silent --location --remote-name https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-bin-${GLIBC_VER}.apk; \
    curl --silent --location --remote-name https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-i18n-${GLIBC_VER}.apk; \
    apk --no-cache add \
        glibc-${GLIBC_VER}.apk \
        glibc-bin-${GLIBC_VER}.apk \
        glibc-i18n-${GLIBC_VER}.apk; \
    # optional: add if needed, will add ~10mb to the final image
    #/usr/glibc-compat/bin/localedef -i en_US -f UTF-8 en_US.UTF-8; \
    # replace symlink to point to glibc version instead of musl version
    ln -sf /usr/glibc-compat/lib/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2; \
    apk --no-cache del curl glibc-i18n; \
    rm -rf \
        /var/cache/apk/* \
        /etc/apk/keys/sgerrand.rsa.pub \
        glibc*${GLIBC_VER}.apk

FROM base as builder
ARG AWS_CLI_VERSION=2.7.33
RUN set euo pipefail; \
    apk --no-cache add curl; \
    curl --silent --location --remote-name https://awscli.amazonaws.com/awscli-exe-linux-x86_64-${AWS_CLI_VERSION}.zip; \
    unzip -q awscli-exe-linux-x86_64-${AWS_CLI_VERSION}.zip; \
    aws/install; \
    aws --version; \
    rm -rf \
        awscli-exe-linux-x86_64-${AWS_CLI_VERSION}.zip \
        aws \
        /usr/local/aws-cli/v2/*/bin/aws_completer \
        /usr/local/aws-cli/v2/*/dist/aws_completer \
        /usr/local/aws-cli/v2/*/dist/awscli/data/ac.index \
        /usr/local/aws-cli/v2/*/dist/awscli/examples; \
    apk --no-cache del \
        binutils \
        curl; \
    rm -rf /var/cache/apk/*

FROM base
COPY --from=builder /usr/local/aws-cli/ /usr/local/aws-cli/
RUN ln -sf /usr/local/aws-cli/v2/current/bin/aws /usr/local/bin/aws
ENTRYPOINT ["aws"]
Metin
  • 661
  • 3
  • 15
0

use and add apk

'''

image:
    name: rxmllc/alpine-aws-cli

before_script:
    - apk --no-cache add curl

'''

please refer https://hub.docker.com/r/rxmllc/alpine-aws-cli

0

Install aws-cli v2 on alpine

apk add aws-cli --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community/
✗ docker run -it --rm alpine sh -c 'apk update && apk add aws-cli --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community/'
...
(42/42) Installing aws-cli (2.11.11-r0)
Executing busybox-1.35.0-r29.trigger
OK: 182 MiB in 57 packages

Install aws-cli v1 on alpine

apk add aws-cli
✗ docker run -it --rm alpine sh -c 'apk update && apk add aws-cli'
...
(27/27) Installing aws-cli (1.25.97-r0)
Executing busybox-1.35.0-r29.trigger
OK: 147 MiB in 42 packages
SomeGuyOnAComputer
  • 5,414
  • 6
  • 40
  • 72
-1

If you are using alpine latest image then this always works for me

- apt update && apt install curl zip jq -y
# install aws cli
  - curl -sL https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip && unzip -q awscliv2.zip && aws/install && rm -rf awscliv2.zip aws /usr/local/aws-cli/v2/*/dist/aws_completer /usr/local/aws-cli/v2/*/dist/awscli/data/ac.index /usr/local/aws-cli/v2/*/dist/awscli/examples
# verify aws cli installation
  - aws --version
-3

you can use in my opinion alpine does not support aws cli V2

RUN apk add --no-cache \
    python3 \
    py3-pip \
&& pip3 install --upgrade pip \
&& pip3 install --no-cache-dir \
    awscli \
&& rm -rf /var/cache/apk/*
Snm Maurya
  • 1,085
  • 10
  • 12
-4

The method published on the official awscliv2 install page for general Linux works fine on Alpine.

RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
    unzip ./awscliv2.zip && \
    rm -f ./awscliv2.zip && \
    ./aws/install -i /usr/local/aws -b /bin && \
    rm -rf ./aws

Just clean up your zip and leftover install files.

https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

-9

There is an official AWS-CLI image on docker hub published by Amazon, although it uses AmazonLinux2 and not Alpine. I will recommend you use it though.

Reference: https://hub.docker.com/r/amazon/aws-cli

It's DockerFile: https://github.com/aws/aws-cli/blob/v2/docker/Dockerfile

FROM amazonlinux:2 as installer
COPY awscli-exe-linux-x86_64.zip .
RUN yum update -y \
  && yum install -y unzip \
  && unzip awscli-exe-linux-x86_64.zip \
  # The --bin-dir is specified so that we can copy the
  # entire bin directory from the installer stage into
  # into /usr/local/bin of the final stage without
  # accidentally copying over any other executables that
  # may be present in /usr/local/bin of the installer stage.
  && ./aws/install --bin-dir /aws-cli-bin/

FROM amazonlinux:2
RUN yum update -y \
  && yum install -y less groff \
  && yum clean all
COPY --from=installer /usr/local/aws-cli/ /usr/local/aws-cli/
COPY --from=installer /aws-cli-bin/ /usr/local/bin/
WORKDIR /aws
ENTRYPOINT ["/usr/local/bin/aws"]
Charles M
  • 49
  • 2