Aws-cli: [v2] Distribuir binarios para alpine / musl libc

Creado en 20 nov. 2019  ·  26Comentarios  ·  Fuente: 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

Errores con:

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

Comentario más útil

La razón por la que funciona la imagen adoptopenjdk es porque incluyen las bibliotecas glibc que faltan. Alphine Linux se basa en 'musl glibc', una alternativa ligera a un glibc completo. Los binarios de aws cli v2 no funcionan con musl, necesitan algunas bibliotecas más para funcionar.

En lugar de usar la imagen de Java, también puede usar el archivo Dockerfile a continuación como un ejemplo de cómo ejecutar AWS CLI v2 en 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/*

Lo anterior descargará las bibliotecas glibc, descargará e instalará AWS CLI v2 y eliminará algunas cosas que probablemente no necesitemos, como la función de autocompletar. La imagen resultante tiene un tamaño de aproximadamente 100 MB.

Todos 26 comentarios

Intenté depurar el problema y no pude averiguar por qué falla. Me parece que el script de instalación es un poco inestable. Intenté agregar la etiqueta v2 también.

Los binarios que publicamos no funcionarán en imágenes de Docker basadas en alpine porque los estamos compilando contra glibc. El sh: aws2: not found es lo que sucede cuando intenta ejecutar este binario. Si lo prueba en una imagen como ubuntu:latest el instalador funcionará.

Además, no creo que alguna vez lanzaríamos un binario compatible con Alpine como lo estamos haciendo para nuestro binario general de Linux. Creo que estaríamos más inclinados a publicar una imagen de la ventana acoplable que viene con nuestro binario construido en alpine.

Gracias por tu respuesta. ¿Es posible documentar eso aquí https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html en "Requisitos previos para Linux", o hacer que el error sea más fácil de usar en el sistema alpino? caso de imagen?

Nos aseguraremos de actualizarlo en la guía del usuario. También me gusta la idea de crear un mensaje de error más fácil de usar para este caso.

@joguSD bummer, alpine es el estándar para imágenes acoplables. Especialmente con los sistemas build / ci que desean automatizar y no desean descargar continuamente imágenes de docker muy grandes.

Sin embargo, puede usar una imagen de la ventana acoplable alpina oficial en una compilación de varias etapas para copiar el binario en otra imagen de la ventana acoplable.

@chadgrant : ¿puede dar un ejemplo de su archivo docker de múltiples etapas?

@ BarakBD-Globality No tengo uno, pero si alguna vez se crea la imagen de aws-alpine, puede hacer:

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

Lástima que no sean compatibles con los alpinos. Es una imagen estándar.

Además, no creo que alguna vez lanzaríamos un binario compatible con Alpine como lo estamos haciendo para nuestro binario general de Linux. Creo que estaríamos más inclinados a publicar una imagen de la ventana acoplable que viene con nuestro binario construido en alpine.

@joguSD ¿ ha habido alguna discusión o moción sobre esto? Parece un gran problema teniendo en cuenta la prevalencia de alpino. La gente como yo usa aws en su cicd y otra automatización, por lo que si no está disponible para imágenes basadas en alpinas, ¡usar la versión 2 ni siquiera es una opción sin un trabajo significativo! Gracias.

tampoco se puede instalar en busybox

Curiosamente, si usa esto como imagen base, la cli de AWS se instalará y funcionará correctamente.

DE adoptopenjdk / openjdk11: alpine

Pude hacer esto usando el siguiente Dockerfile

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 razón por la que funciona la imagen adoptopenjdk es porque incluyen las bibliotecas glibc que faltan. Alphine Linux se basa en 'musl glibc', una alternativa ligera a un glibc completo. Los binarios de aws cli v2 no funcionan con musl, necesitan algunas bibliotecas más para funcionar.

En lugar de usar la imagen de Java, también puede usar el archivo Dockerfile a continuación como un ejemplo de cómo ejecutar AWS CLI v2 en 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/*

Lo anterior descargará las bibliotecas glibc, descargará e instalará AWS CLI v2 y eliminará algunas cosas que probablemente no necesitemos, como la función de autocompletar. La imagen resultante tiene un tamaño de aproximadamente 100 MB.

Entonces, ¿cuál es la ruta más corta para obtener un aws ecr get-login-password … | docker login … dentro de un contenedor docker en ejecución? (lo que implica: docker:dind )?

Me encantaría evitar construir mi propia imagen docker:stable con soporte docker:dind . Al menos pude gracias a la solución https://github.com/aws/aws-cli/issues/4685#issuecomment -615872019. ¡Gracias por eso!

@bentolor Dado que docker:dind también usa alpine, sospecho que todo lo que tienes que hacer es cambiar la primera línea del Dockerfile mencionado anteriormente. En lugar de FROM alpine:3.11 , debe usar FROM docker:dind . Sin embargo, significa que estás construyendo tu propia imagen ...

gracias @blagerweij funciona muy bien

También gracias @blagerweij : agarré la ortiga y construí una imagen docker pública y personalizada copiando y pegando su solución: https://hub.docker.com/r/bentolor/docker-dind-awscli

@bentolor Noté en su repositorio que su Dockerfile usa FROM docker:stable lugar de FROM docker:dind . Pensé que el objetivo era crear una imagen para Docker en Docker con el soporte de AWS.

@blagerweij Vea la imagen a continuación de la imagen oficial de Docker como ilustración.

El uso típico es:

  1. Uno (o su ci) inicia una instancia docker:dind y luego
  2. Inicia una instancia docker:stable separada que está vinculada al contenedor docker:dind iniciado
  3. Empieza a ejecutar los comandos docker dentro del segundo contenedor que redirige los comandos a través de la conexión de socket al demonio docker que se ejecuta dentro del primer contenedor docker:dind .

Por lo tanto: si bien es cierto que la instancia docker:dind eventualmente ejecuta sus comandos de Docker, su interfaz CLI en realidad vive en una instancia docker:stable . Y ese es el lugar donde uno, es decir, necesita iniciar sesión en AWS ;-)

Al menos este es el patrón de uso que conozco (es decir, sobre el uso de Gitlab CI para crear imágenes de Docker). ¿Quizás también hay escenarios de uso directo docker:dind ?

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

Se puede usar la imagen alpina con glibc de https://hub.docker.com/r/frolvlad/alpine-glibc/
e instale aws cli siguiendo los pasos de la documentación de aws. Trabajó para mi.

@blagerweij Usé su script con la
/usr/glibc-compat/sbin/ldconfig: /usr/glibc-compat/lib/ld-linux-x86-64.so.2 is not a symbolic link

@amiram Sí, también recibo ese mensaje, es una advertencia que simplemente puede ignorar: se espera un enlace simbólico, pero el archivo presente es un archivo normal. Ver https://github.com/envoyproxy/envoy/issues/9078#issuecomment -576837432

¿Alguien podría cambiar el nombre de este problema a algo como: "Distribuir binarios para alpine / musl"?

@joguSD @ jordanst3wart

Sí, estoy contento con "Distribuir binarios para alpine / musl libc". Avísame si tienes algún problema

Solo necesito aws s3 cp para un proyecto apasionante, así que acabo de instalar awscli V1 con pip:

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

La razón por la que funciona la imagen adoptopenjdk es porque incluyen las bibliotecas glibc que faltan. Alphine Linux se basa en 'musl glibc', una alternativa ligera a un glibc completo. Los binarios de aws cli v2 no funcionan con musl, necesitan algunas bibliotecas más para funcionar.

En lugar de usar la imagen de Java, también puede usar el archivo Dockerfile a continuación como un ejemplo de cómo ejecutar AWS CLI v2 en Alpine Linux:

recorte

Lo anterior descargará las bibliotecas glibc, descargará e instalará AWS CLI v2 y eliminará algunas cosas que probablemente no necesitemos, como la función de autocompletar. La imagen resultante tiene un tamaño de aproximadamente 100 MB.

este ajuste obtendrá la última versión automáticamente si no desea codificar la versión 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/*

También puede utilizar el archivo Dockerfile a continuación como ejemplo de cómo ejecutar AWS CLI v2 en Alpine Linux:

El Dockerfile / script proporcionado funciona pero muestra este error, que no parece impedir que funcione:

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

Curiosamente, ejecutar apk add mandoc justo antes de aws/install evita mostrar este error y eliminar ese paquete después de la instalación no tiene ningún efecto negativo. Otros paquetes aleatorios no parecen tener este efecto protector.

¿Alguna idea?

Se requiere PS apk add less para que aws help funcione correctamente (de lo contrario, se quejará de que falta el paquete groff ).

¿Fue útil esta página
0 / 5 - 0 calificaciones