Aws-cli: [v2] Distribuer des binaires pour alpine / musl libc

Créé le 20 nov. 2019  ·  26Commentaires  ·  Source: aws/aws-cli

docker run -it --rm docker:latest sh
wget "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-linux-x86_64.zip" -O "awscliv2.zip"
# curl not installed
unzip awscliv2.zip
./aws/install
# sudo not install

Erreurs avec :

/ # ./aws/install
./aws/install: line 78: /aws/dist/aws2: not found
You can now run: /usr/local/bin/aws2 --version
/ # aws2
sh: aws2: not found
confusing-error v2

Commentaire le plus utile

La raison pour laquelle l'image adoptopenjdk fonctionne est qu'elle inclut les bibliothèques glibc manquantes. Alphine linux est basé sur 'musl glibc', une alternative légère à une glibc complète. Les binaires aws cli v2 ne fonctionnent pas avec musl, ils ont besoin de quelques bibliothèques supplémentaires pour fonctionner.

Au lieu d'utiliser l'image Java, vous pouvez également utiliser le fichier Docker ci-dessous comme exemple d'exécution de l'AWS CLI v2 sur Alpine Linux :

FROM alpine:3.11

ENV GLIBC_VER=2.31-r0

# install glibc compatibility for alpine
RUN apk --no-cache add \
        binutils \
        curl \
    && curl -sL https://alpine-pkgs.sgerrand.com/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/*

Ce qui précède téléchargera les bibliothèques glibc, téléchargera et installera l'AWS CLI v2 et supprimera certains éléments dont nous n'avons probablement pas besoin, tels que la saisie semi-automatique. L'image résultante a une taille d'environ 100 Mo

Tous les 26 commentaires

J'ai essayé de déboguer le problème et je n'ai pas pu comprendre pourquoi il échoue. Il me semble que le script d'installation est juste un peu floconneux. J'ai également essayé d'ajouter l'étiquette v2.

Les binaires que nous publions ne fonctionneront pas sur les images docker basées sur alpine car nous les compilons avec la glibc. Le sh: aws2: not found est ce qui se passe lorsque vous essayez d'exécuter ce binaire. Si vous l'essayez sur une image comme ubuntu:latest le programme d'installation fonctionnera.

De plus, je ne pense pas que nous publierions un jour un binaire compatible alpin comme nous le faisons pour notre binaire Linux général. Je pense que nous serions plus enclins à publier une image docker fournie avec notre binaire construit sur alpine.

Merci pour votre réponse. Est-il possible de documenter cela ici https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html sous "Prérequis pour Linux", ou de rendre l'erreur plus conviviale dans le domaine alpin cas d'image?

Nous veillerons à ce que cela soit mis à jour dans le guide de l'utilisateur. J'aime aussi l'idée de créer un message d'erreur plus convivial pour ce cas.

@joguSD déception , alpine est la norme pour les images docker. Surtout avec les systèmes build/ci voulant automatiser et ne voulant pas télécharger continuellement de très grandes images docker.

Peut utiliser une image docker alpine officielle dans une construction en plusieurs étapes pour copier le binaire dans une autre image docker.

@chadgrant - pouvez-vous donner un exemple s'il vous plaît de votre fichier docker multi-étapes ?

@BarakBD-Globality Je n'en ai pas, mais si l'image aws-alpine est créée, vous pouvez simplement faire :

FROM aws_alpine_image:latest as aws
FROM alpine:latest
COPY --from=aws /usr/local/bin/binary /usr/local/bin/binary

Dommage qu'ils ne supportent pas l'alpin. C'est une image standard.

De plus, je ne pense pas que nous publierions un jour un binaire compatible alpin comme nous le faisons pour notre binaire Linux général. Je pense que nous serions plus enclins à publier une image docker fournie avec notre binaire construit sur alpine.

@joguSD y a-t-il eu une discussion ou une motion à ce sujet ? Cela semble être un gros problème compte tenu de la prévalence de l'alpin. Les gens comme moi utilisent aws dans leur cicd et autres automatisations, donc si ce n'est pas disponible pour les images alpines, l'utilisation de la version 2 n'est même pas une option sans un travail important ! Merci.

ne peut pas non plus installer dans busybox

Fait intéressant, si vous l'utilisez comme image de base, la CLI AWS s'installera et fonctionnera correctement.

DE adoptopenjdk/openjdk11:alpine

J'ai pu le faire en utilisant le Dockerfile suivant

FROM adoptopenjdk/openjdk11:alpine

RUN apk add --no-cache \
        ca-certificates \
        unzip \
        curl \
        groff \
        less  \
        bash  \
        openssh-client

WORKDIR /home
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
    && unzip awscliv2.zip \
    && ./aws/install \
    && rm awscliv2.zip \
    && rm -R aws

La raison pour laquelle l'image adoptopenjdk fonctionne est qu'elle inclut les bibliothèques glibc manquantes. Alphine linux est basé sur 'musl glibc', une alternative légère à une glibc complète. Les binaires aws cli v2 ne fonctionnent pas avec musl, ils ont besoin de quelques bibliothèques supplémentaires pour fonctionner.

Au lieu d'utiliser l'image Java, vous pouvez également utiliser le fichier Docker ci-dessous comme exemple d'exécution de l'AWS CLI v2 sur Alpine Linux :

FROM alpine:3.11

ENV GLIBC_VER=2.31-r0

# install glibc compatibility for alpine
RUN apk --no-cache add \
        binutils \
        curl \
    && curl -sL https://alpine-pkgs.sgerrand.com/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/*

Ce qui précède téléchargera les bibliothèques glibc, téléchargera et installera l'AWS CLI v2 et supprimera certains éléments dont nous n'avons probablement pas besoin, tels que la saisie semi-automatique. L'image résultante a une taille d'environ 100 Mo

Alors, quel est le chemin le plus court pour obtenir un aws ecr get-login-password … | docker login … dans un conteneur Docker en cours d'exécution ? (ce qui implique : docker:dind ) ?

J'aimerais éviter de créer ma propre image docker:stable avec le support docker:dind . Au moins, je pourrais grâce à la solution https://github.com/aws/aws-cli/issues/4685#issuecomment -615872019. Merci pour ça!

@bentolor Étant donné que docker:dind utilise également alpine, je suppose que tout ce que vous avez à faire est de changer la première ligne du Dockerfile mentionné ci-dessus. Au lieu de FROM alpine:3.11 vous devriez utiliser FROM docker:dind . Cela signifie que vous construisez votre propre image, cependant...

merci @blagerweij fonctionne très bien

Merci également @blagerweij : j'ai saisi l'ortie et construit une image docker publique et personnalisée en copiant/collant votre solution : https://hub.docker.com/r/bentolor/docker-dind-awscli

@bentolor J'ai remarqué dans votre dépôt que votre Dockerfile utilise FROM docker:stable au lieu de FROM docker:dind . Je pensais que le but était de créer une image pour Docker dans Docker avec le support AWS ?

@blagerweij Voir l'image ci-dessous de l' image officielle de Docker pour illustration.

L'utilisation typique est :

  1. Un (ou votre ci) démarre une instance docker:dind puis
  2. Démarre une instance docker:stable distincte qui est liée au conteneur docker:dind démarré
  3. Vous commencez à exécuter des commandes docker à l'intérieur du deuxième conteneur qui redirige les commandes via une connexion socket vers le démon docker s'exécutant dans le premier conteneur docker:dind .

Par conséquent : s'il est vrai que l'instance docker:dind exécute finalement vos commandes Docker, votre interface CLI réside en fait dans une instance docker:stable . Et c'est l'endroit où l'on doit se connecter à AWS ;-)

Au moins, c'est le modèle d'utilisation que je connais (c'est-à-dire sur l'utilisation de Gitlab CI pour créer des images docker:dind ?

Usage of <a href="docker:stable">docker:stable</a> vs. <a href="docker:didn">docker:didn</a>

On peut utiliser l'image alpine avec la glibc de https://hub.docker.com/r/frolvlad/alpine-glibc/
et installez aws cli en suivant les étapes de la documentation aws. A travaillé pour moi.

@blagerweij J'ai utilisé votre script avec le docker dans l'image docker. aws cli fonctionne bien. Je viens d'avoir une erreur dans la construction :
/usr/glibc-compat/sbin/ldconfig: /usr/glibc-compat/lib/ld-linux-x86-64.so.2 is not a symbolic link

@amiram Oui, je reçois également ce message, c'est un avertissement que vous pouvez simplement ignorer : il attend un lien symbolique, mais le fichier présent est un fichier normal. Voir https://github.com/envoyproxy/envoy/issues/9078#issuecomment -576837432

Quelqu'un pourrait-il renommer ce problème en quelque chose comme : « Distribute binaires pour alpine / musl » ?

@joguSD @jordanst3wart

Ouais, je suis content de "Distribute binaires pour alpine / musl libc". Faites-moi savoir si vous avez des problèmes

Je n'ai besoin que d'aws s3 cp pour un projet passion, donc je viens d'installer awscli V1 avec pip :

FROM alpine:3.12
RUN pip install awscli        
RUN aws s3 ..

La raison pour laquelle l'image adoptopenjdk fonctionne est qu'elle inclut les bibliothèques glibc manquantes. Alphine linux est basé sur 'musl glibc', une alternative légère à une glibc complète. Les binaires aws cli v2 ne fonctionnent pas avec musl, ils ont besoin de quelques bibliothèques supplémentaires pour fonctionner.

Au lieu d'utiliser l'image Java, vous pouvez également utiliser le fichier Docker ci-dessous comme exemple d'exécution de l'AWS CLI v2 sur Alpine Linux :

couper

Ce qui précède téléchargera les bibliothèques glibc, téléchargera et installera l'AWS CLI v2 et supprimera certains éléments dont nous n'avons probablement pas besoin, tels que la saisie semi-automatique. L'image résultante a une taille d'environ 100 Mo

cet ajustement récupérera automatiquement la dernière version si vous ne souhaitez pas coder en dur la version de la glibc :

FROM alpine

# install glibc compatibility for alpine
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://alpine-pkgs.sgerrand.com/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/*

vous pouvez également utiliser le Dockerfile ci-dessous comme exemple d'exécution d'AWS CLI v2 sur Alpine Linux :

Le Dockerfile/script fourni fonctionne mais affiche cette erreur, qui ne semble pas l'empêcher de fonctionner :

aws/install: line 78: /aws/dist/aws: not found

Étrangement, exécuter apk add mandoc juste avant aws/install évite d'afficher cette erreur, et la suppression de ce paquet après l'installation n'a aucun effet néfaste. D'autres emballages aléatoires ne semblent pas avoir cet effet protecteur.

Des pensées?

PS apk add less est requis pour que aws help fonctionne correctement (il se plaindra du paquet manquant groff sinon).

Cette page vous a été utile?
0 / 5 - 0 notes