How to install aws-cli on alpine?
Asked Answered
A

16

104

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!

Aciculum answered 20/5, 2020 at 17:14 Comment(3)
can you share your base image?Fuzzy
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. (#61902849)Aciculum
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'.Herson
R
191

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

apk add --no-cache aws-cli
Recurvate answered 6/3, 2022 at 9:32 Comment(3)
should mention this is version 1Nonstandard
Installing aws-cli on alpine 1.8 will install aws-cli v2Publicly
Tested this, aws --version prints aws-cli/2.13.5 now (alpine:3 base image).Gaffrigged
G
143

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.

Giantess answered 1/6, 2020 at 17:49 Comment(4)
Note this installs CLI v1, not the new v2 CLIWeizmann
Python 3 is deprecated and now you'll face: ERROR: unsatisfiable constraints: python (missing): required by: world[python] To resolve it, switch to apk add --no-cache python3 py3-pip to install Python 3 dependencies.Gamic
*Python 2 is (finally) deprecated.Iamb
Votred down because answer of Dr.Crazy is much better.Strophic
E
23

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
Enphytotic answered 30/1, 2021 at 14:46 Comment(2)
It worked! aws-cli/2.2.4 Python/3.8.8 Linux/4.19.121-linuxkit exe/x86_64.alpine.3 prompt/offStreetcar
&& 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 basedOversubscribe
S
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
Schumann answered 8/2, 2022 at 5:7 Comment(1)
This is actually the only answer that works at the command line without needing to make a special image. Thank you!Cuprite
W
3
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   
Weave answered 21/4, 2021 at 7:41 Comment(3)
This solution doesn't work on Alpine without Glibc installedTravis
Might also consider removing awscliv2.zip once it's installed to save yourself some space.Burglar
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 github.com/aws/aws-cli/issues/4685#issuecomment-615872019Alviani
A
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"

Alica answered 31/5, 2022 at 14:3 Comment(2)
This is the best solution I've tried.Postfix
Quote the solution, don't just put a link.Monogyny
T
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"]
Tipstaff answered 17/9, 2022 at 18:12 Comment(1)
Thanks, this fixed it for me! Specifically the ln -sf symlink updateBrott
D
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

Dragelin answered 30/12, 2022 at 10:21 Comment(0)
G
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
Guildhall answered 12/4, 2023 at 21:9 Comment(0)
I
0

To install aws cli v2+, use $ apk add 'aws-cli>2'

Inversely answered 28/9, 2023 at 9:40 Comment(1)
That only works if you're using alpine 3.18 or higher. In which case, you don't even need the >2Margarite
M
0

For those running on nodeJS, this should do it since slim has glibc installed.

And yes, slim is debian and not alpine but can help someone else struggling with this if they can afford to increase their images by some MBs

FROM public.ecr.aws/docker/library/node:18.14.2-slim

RUN apt update && apt install curl unzip -y

ARG AWS_CLI_VERSION="2.15.8"
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-${AWS_CLI_VERSION}.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN ./aws/install --bin-dir /usr/bin --install-dir /usr/bin/aws-cli
Margarite answered 8/1 at 18:38 Comment(0)
C
0

Just add the symlinks option

-b, --bin-dir The directory to store symlinks to executables for the AWS CLI v2. By default, the directory used is: /usr/local/bin

./aws/install   -b /usr/local/bin/aws
Camillacamille answered 27/3 at 18:48 Comment(0)
B
-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
Burly answered 4/8, 2022 at 14:52 Comment(0)
M
-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/*
Morey answered 3/1, 2022 at 9:16 Comment(0)
O
-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

Overton answered 13/2, 2022 at 18:17 Comment(2)
It doesn't workGreataunt
./aws/install: line 78: /aws/dist/aws: not found; You can now run: /bin/aws --version; No goodSuccinic
A
-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"]
Alisonalissa answered 2/6, 2020 at 22:34 Comment(2)
While this works, AmazonLinux2 is significantly larger image than Alpine.Crevice
Alpine does not use yum as a package managerSuccinic

© 2022 - 2024 — McMap. All rights reserved.