Aws-cli: [v2] Verteilen Sie Binärdateien für alpine / musl libc

Erstellt am 20. Nov. 2019  ·  26Kommentare  ·  Quelle: 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

Fehler mit:

/ # ./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

Hilfreichster Kommentar

Der Grund dafür, dass das adoptopenjdk-Image funktioniert, ist, dass es die fehlenden glibc-Bibliotheken enthält. Alphine linux basiert auf 'musl glibc', einer leichtgewichtigen Alternative zu einer ausgewachsenen glibc. Die aws cli v2-Binärdateien funktionieren nicht mit musl, sie benötigen ein paar weitere Bibliotheken, um zu funktionieren.

Anstatt das Java-Image zu verwenden, können Sie auch das Dockerfile unten als Beispiel für die Ausführung von AWS CLI v2 unter Alpine Linux verwenden:

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/*

Das Obige lädt die glibc-Bibliotheken herunter, lädt AWS CLI v2 herunter und installiert sie und entfernt einige Dinge, die wir wahrscheinlich nicht benötigen, wie z. B. die automatische Vervollständigung. Das resultierende Bild ist etwa 100 MB groß

Alle 26 Kommentare

Ich habe versucht, das Problem zu debuggen, konnte aber nicht herausfinden, warum es fehlschlägt. Es scheint mir, dass das Installationsskript nur ein bisschen flockig ist. Ich habe auch versucht, das v2-Label hinzuzufügen.

Die von uns veröffentlichten Binärdateien funktionieren nicht für Docker-Images, die auf alpine basieren, da wir sie gegen glibc kompilieren. Das sh: aws2: not found passiert, wenn Sie versuchen, diese Binärdatei auszuführen. Wenn Sie es mit einem Image wie ubuntu:latest versuchen, funktioniert das Installationsprogramm.

Außerdem glaube ich nicht, dass wir jemals eine alpine kompatible Binärdatei veröffentlichen würden, wie wir es für unsere allgemeine Linux-Binärdatei tun. Ich denke, wir wären eher geneigt, einfach ein Docker-Image zu veröffentlichen, das mit unserer auf Alpine basierenden Binärdatei geliefert wird.

Danke für deine Antwort. Ist es möglich, das hier https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html unter "Voraussetzungen für Linux" zu dokumentieren oder den Fehler im alpine based benutzerfreundlicher zu gestalten? Bild Fall?

Wir werden dafür sorgen, dass dies im Benutzerhandbuch aktualisiert wird. Ich mag auch die Idee, für diesen Fall eine benutzerfreundlichere Fehlermeldung zu erstellen.

@joguSD schade, alpine ist der Standard für Docker-Images. Besonders bei Build-/CI-Systemen, die automatisieren möchten und nicht ständig sehr große Docker-Images herunterladen möchten.

Kann jedoch ein offizielles alpines Docker-Image in einem mehrstufigen Build verwenden, um die Binärdatei in ein anderes Docker-Image zu kopieren.

@chadgrant - können Sie bitte ein Beispiel für Ihre mehrstufige Dockerdatei geben?

@BarakBD-Globality Ich habe keine, aber wenn das aws-alpine-Image jemals erstellt wird, können Sie einfach Folgendes tun:

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

Schade, dass sie Alpin nicht unterstützen. Es ist ein Standardbild.

Außerdem glaube ich nicht, dass wir jemals eine alpine kompatible Binärdatei veröffentlichen würden, wie wir es für unsere allgemeine Linux-Binärdatei tun. Ich denke, wir wären eher geneigt, einfach ein Docker-Image zu veröffentlichen, das mit unserer auf Alpine basierenden Binärdatei geliefert wird.

@joguSD gab es hierzu eine Diskussion oder einen Antrag? Es scheint eine ziemlich große Sache zu sein, wenn man die Prävalenz von Alpine bedenkt. Leute wie ich verwenden aws in ihrer Cicd- und anderen Automatisierung. Wenn es also für alpenbasierte Bilder nicht verfügbar ist, ist die Verwendung von Version 2 ohne erheblichen Aufwand nicht einmal eine Option! Vielen Dank.

kann auch nicht in busybox installiert werden

Interessanterweise wird die AWS-Cli installiert und funktioniert ordnungsgemäß, wenn Sie dies als Basis-Image verwenden.

VON adoptopenjdk/openjdk11:alpine

Ich konnte dies mit dem folgenden Dockerfile tun

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

Der Grund dafür, dass das adoptopenjdk-Image funktioniert, ist, dass es die fehlenden glibc-Bibliotheken enthält. Alphine linux basiert auf 'musl glibc', einer leichtgewichtigen Alternative zu einer ausgewachsenen glibc. Die aws cli v2-Binärdateien funktionieren nicht mit musl, sie benötigen ein paar weitere Bibliotheken, um zu funktionieren.

Anstatt das Java-Image zu verwenden, können Sie auch das Dockerfile unten als Beispiel für die Ausführung von AWS CLI v2 unter Alpine Linux verwenden:

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/*

Das Obige lädt die glibc-Bibliotheken herunter, lädt AWS CLI v2 herunter und installiert sie und entfernt einige Dinge, die wir wahrscheinlich nicht benötigen, wie z. B. die automatische Vervollständigung. Das resultierende Bild ist etwa 100 MB groß

Was ist also der kürzeste Weg, um ein aws ecr get-login-password … | docker login … in einem Docker-Container zum Laufen zu bringen? (was bedeutet: docker:dind )?

Ich würde es gerne vermeiden, mein eigenes docker:stable Image mit docker:dind Unterstützung zu erstellen. Zumindest konnte ich dank https://github.com/aws/aws-cli/issues/4685#issuecomment -615872019 eine Lösung finden. Dank dafür!

@bentolor Da docker:dind auch alpine verwendet, vermute ich, dass Sie nur die erste Zeile des oben genannten Dockerfiles ändern müssen. Anstelle von FROM alpine:3.11 sollten Sie FROM docker:dind . Es bedeutet jedoch, dass Sie Ihr eigenes Image aufbauen....

danke @blagerweij funktioniert wirklich gut

Danke auch @blagerweij : Ich habe die Brennnessel eingefügt habe: https://hub.docker.com/r/bentolor/docker-dind-awscli

@bentolor Ich habe in Ihrem Repo bemerkt, dass Ihr Dockerfile FROM docker:stable anstelle von FROM docker:dind . Ich dachte, es geht darum, ein Image für Docker in Docker mit AWS-Unterstützung zu erstellen?

@blagerweij Siehe das Bild unten vom offiziellen Docker-Bild zur Veranschaulichung.

Die typische Verwendung ist:

  1. Eine (oder Ihr CI) startet eine docker:dind Instanz und dann
  2. Startet eine separate docker:stable Instanz, die mit dem gestarteten docker:dind Container verknüpft ist
  3. Sie beginnen mit der Ausführung von docker Befehlen im zweiten Container, der die Befehle über eine Socket-Verbindung zum Docker-Daemon umleitet, der im ersten docker:dind Container ausgeführt wird.

Deshalb: Es stimmt zwar, dass die docker:dind Instanz schließlich Ihre Docker-Befehle ausführt, Ihr CLI-Frontend lebt jedoch tatsächlich in einer docker:stable Instanz. Und dort muss man sich zB in AWS einloggen ;-)

Zumindest ist dies das mir bekannte Verwendungsmuster (dh die Verwendung von Gitlab CI zum Erstellen von Docker-Images). Vielleicht gibt es auch direkte docker:dind Nutzungsszenarien?

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

Man kann alpines Image mit glibc von https://hub.docker.com/r/frolvlad/alpine-glibc/ verwenden
und installieren Sie AWS CLI, indem Sie die Schritte aus der AWS-Dokumentation befolgen. Hat bei mir funktioniert.

@blagerweij Ich habe Ihr Skript mit dem Docker im Docker-Image verwendet. AWS CLI funktioniert einwandfrei. Ich habe gerade einen Fehler beim Build:
/usr/glibc-compat/sbin/ldconfig: /usr/glibc-compat/lib/ld-linux-x86-64.so.2 is not a symbolic link

@amiram Ja, ich erhalte auch diese Nachricht, das ist eine Warnung, die Sie einfach ignorieren können: Es wird ein Symlink erwartet, aber die vorhandene Datei ist eine normale Datei. Siehe https://github.com/envoyproxy/envoy/issues/9078#issuecomment -576837432

Könnte jemand dieses Problem umbenennen in etwa: "Binärdateien für Alpin / Muss verteilen"?

@joguSD @jordanst3wart

Ja, ich bin zufrieden mit "Binärdateien für alpine / musl libc verteilen". Lass mich wissen, wenn du irgendwelche Probleme hast

Ich brauche nur aws s3 cp für ein Leidenschaftsprojekt, also habe ich awscli V1 mit pip installiert:

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

Der Grund dafür, dass das adoptopenjdk-Image funktioniert, ist, dass es die fehlenden glibc-Bibliotheken enthält. Alphine linux basiert auf 'musl glibc', einer leichtgewichtigen Alternative zu einer ausgewachsenen glibc. Die aws cli v2-Binärdateien funktionieren nicht mit musl, sie benötigen ein paar weitere Bibliotheken, um zu funktionieren.

Anstatt das Java-Image zu verwenden, können Sie auch das Dockerfile unten als Beispiel für die Ausführung von AWS CLI v2 unter Alpine Linux verwenden:

schnipsen

Das Obige lädt die glibc-Bibliotheken herunter, lädt AWS CLI v2 herunter und installiert sie und entfernt einige Dinge, die wir wahrscheinlich nicht benötigen, wie z. B. die automatische Vervollständigung. Das resultierende Bild ist etwa 100 MB groß

Diese Anpassung ruft automatisch die neueste Version ab, wenn Sie die glibc-Version nicht hart codieren möchten:

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/*

Sie können auch das Dockerfile unten als Beispiel für die Ausführung von AWS CLI v2 unter Alpine Linux verwenden:

Das bereitgestellte Dockerfile/Skript funktioniert, zeigt jedoch diesen Fehler an, der die Funktion nicht zu verhindern scheint:

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

Seltsamerweise wird dieser Fehler vermieden, wenn apk add mandoc kurz vor aws/install wird, und das Löschen dieses Pakets nach der Installation hat keine negativen Auswirkungen. Zufällige andere Pakete scheinen diese Schutzwirkung nicht zu haben.

Irgendwelche Gedanken?

PS apk add less ist erforderlich, damit aws help korrekt funktioniert (es wird sich sonst über fehlendes Paket groff beschweren).

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen