Aws-cli: [v2] Распространение двоичных файлов для alpine / musl libc

Созданный на 20 нояб. 2019  ·  26Комментарии  ·  Источник: 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

Ошибки с:

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

Самый полезный комментарий

Причина того, что образ accepttopenjdk работает, заключается в том, что они включают недостающие библиотеки glibc. Alphine linux основан на musl glibc, облегченной альтернативе полномасштабному glibc. Бинарные файлы aws cli v2 не работают с musl, для работы им нужно еще несколько библиотек.

Вместо использования образа Java вы также можете использовать приведенный ниже файл Dockerfile в качестве примера запуска AWS CLI v2 в 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/*

Вышеупомянутое загрузит библиотеки glibc, загрузит и установит AWS CLI v2 и удалит некоторые вещи, которые нам, вероятно, не нужны, например автозаполнение. Размер результирующего изображения составляет около 100 МБ.

Все 26 Комментарий

Я попытался отладить проблему и не мог понять, почему это не удается. Мне кажется, что сценарий установки немного нестабилен. Я также попытался добавить метку v2.

Публикуемые нами двоичные файлы не будут работать с образами докеров на основе alpine потому что мы компилируем их с использованием glibc. sh: aws2: not found - это то, что происходит, когда вы пытаетесь выполнить этот двоичный файл. Если вы попробуете его на изображении типа ubuntu:latest установщик будет работать.

Вдобавок я не думаю, что мы когда-нибудь выпустим бинарный файл, совместимый с alpine, как мы делаем для нашего общего бинарного файла Linux. Я думаю, что мы были бы более склонны просто выпустить образ докера, который идет с нашим двоичным файлом, созданным на alpine.

Спасибо за Ваш ответ. Можно ли задокументировать это здесь https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html в разделе «Необходимые условия для Linux» или сделать ошибку более удобной для пользователя в версии на базе Alpine. чехол с изображением?

Мы обязательно обновим это в руководстве пользователя. Мне также нравится идея сделать более удобное сообщение об ошибке для этого случая.

@joguSD облом, alpine - это стандарт для образов

Тем не менее, можно использовать официальный образ докера alpine в многоэтапной сборке для копирования двоичного файла в другой образ докера.

@chadgrant - не могли бы вы привести пример вашего многоступенчатого dockerfile?

@ BarakBD-Globality У меня его нет, но если образ aws-alpine когда-либо будет создан, вы можете просто сделать:

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

Жаль, что они не поддерживают альпинизм. Это стандартный образ.

Вдобавок я не думаю, что мы когда-нибудь выпустим бинарный файл, совместимый с alpine, как мы делаем для нашего общего бинарного файла Linux. Я думаю, что мы были бы более склонны просто выпустить образ докера, который идет с нашим двоичным файлом, созданным на alpine.

@joguSD Было ли это обсуждение или движение? Это кажется большим делом, учитывая преобладание альпийских горок. Такие люди, как я, используют aws в своих cicd и других средствах автоматизации, поэтому, если он недоступен для изображений на основе alpine, использование версии 2 не является вариантом без значительной работы! Спасибо.

также нельзя установить в busybox

Интересно, что если вы используете его в качестве базового образа, AWS cli установится и будет работать правильно.

ОТ accepttopenjdk / openjdk11: альпийский

Я смог сделать это, используя следующий файл 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

Причина того, что образ accepttopenjdk работает, заключается в том, что они включают недостающие библиотеки glibc. Alphine linux основан на musl glibc, облегченной альтернативе полномасштабному glibc. Бинарные файлы aws cli v2 не работают с musl, для работы им нужно еще несколько библиотек.

Вместо использования образа Java вы также можете использовать приведенный ниже файл Dockerfile в качестве примера запуска AWS CLI v2 в 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/*

Вышеупомянутое загрузит библиотеки glibc, загрузит и установит AWS CLI v2 и удалит некоторые вещи, которые нам, вероятно, не нужны, например автозаполнение. Размер результирующего изображения составляет около 100 МБ.

Итак, каков кратчайший путь к запуску aws ecr get-login-password … | docker login … внутри контейнера докеров? (что подразумевает: docker:dind )?

Я бы не хотел создавать свой собственный образ docker:stable с поддержкой docker:dind . По крайней мере, я мог бы поблагодарить решение https://github.com/aws/aws-cli/issues/4685#issuecomment -615872019. Спасибо за это!

@bentolor Поскольку docker:dind также использует alpine, я подозреваю, что все, что вам нужно сделать, это изменить первую строку вышеупомянутого файла Dockerfile. Вместо FROM alpine:3.11 следует использовать FROM docker:dind . Однако это означает, что вы создаете свой собственный имидж ....

спасибо @blagerweij работает очень хорошо

Также спасибо @blagerweij : я https://hub.docker.com/r/bentolor/docker-dind-awscli

@bentolor Я заметил в вашем репо, что ваш Dockerfile использует FROM docker:stable вместо FROM docker:dind . Я думал, все дело в том, чтобы создать образ для Docker в Docker с поддержкой AWS?

@blagerweij См. изображение ниже из официального образа Docker для иллюстрации.

Типичное использование:

  1. Один (или ваш ci) запускает экземпляр docker:dind а затем
  2. Запускает отдельный экземпляр docker:stable , связанный с запущенным контейнером docker:dind
  3. Вы начинаете выполнять команды docker внутри второго контейнера, который перенаправляет команды через соединение сокета на демон docker, работающий внутри первого контейнера docker:dind .

Следовательно: хотя верно, что экземпляр docker:dind конечном итоге выполняет ваши команды Docker, ваш интерфейс командной строки фактически живет в экземпляре docker:stable . И это то место, где нужно войти в AWS ;-)

По крайней мере, это шаблон использования, о котором я знаю (например, об использовании Gitlab CI для создания образов docker:dind ?

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

Можно использовать образ alpine с glibc с https://hub.docker.com/r/frolvlad/alpine-glibc/
и установите aws cli, следуя инструкциям из документации aws. Работал у меня.

@blagerweij Я использовал ваш скрипт с докером в образе докера. aws cli отлично работает. Я только что получил ошибку при сборке:
/usr/glibc-compat/sbin/ldconfig: /usr/glibc-compat/lib/ld-linux-x86-64.so.2 is not a symbolic link

@amiram Да, я тоже получаю это сообщение, это предупреждение, которое вы можете просто проигнорировать: ожидается символическая ссылка, но существующий файл является обычным файлом. См. Https://github.com/envoyproxy/envoy/issues/9078#issuecomment -576837432

Может ли кто-нибудь переименовать эту проблему в нечто вроде: «Распространять двоичные файлы для alpine / musl»?

@joguSD @ jordanst3wart

Да, я доволен "Распространять двоичные файлы для alpine / musl libc". Сообщите мне, если у вас возникнут проблемы

Мне нужен aws s3 cp только для увлеченного проекта, поэтому я только что установил awscli V1 с помощью pip:

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

Причина того, что образ accepttopenjdk работает, заключается в том, что они включают недостающие библиотеки glibc. Alphine linux основан на musl glibc, облегченной альтернативе полномасштабному glibc. Бинарные файлы aws cli v2 не работают с musl, для работы им нужно еще несколько библиотек.

Вместо использования образа Java вы также можете использовать приведенный ниже файл Dockerfile в качестве примера запуска AWS CLI v2 в Alpine Linux:

отрезать

Вышеупомянутое загрузит библиотеки glibc, загрузит и установит AWS CLI v2 и удалит некоторые вещи, которые нам, вероятно, не нужны, например автозаполнение. Размер результирующего изображения составляет около 100 МБ.

эта настройка автоматически загрузит последнюю версию, если вы не хотите жестко кодировать версию 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/*

вы также можете использовать приведенный ниже файл Dockerfile в качестве примера запуска AWS CLI v2 в Alpine Linux:

Предоставленный Dockerfile / скрипт работает, но отображает эту ошибку, которая, похоже, не мешает ему работать:

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

Как ни странно, запуск apk add mandoc непосредственно перед aws/install позволяет избежать отображения этой ошибки, и удаление этого пакета после установки не имеет никакого вреда. Случайные другие пакеты, похоже, не обладают этим защитным эффектом.

Есть предположения?

PS apk add less требуется для aws help , чтобы работать правильно (он будет жаловаться на отсутствие пакет groff в противном случае).

Была ли эта страница полезной?
0 / 5 - 0 рейтинги