Aws-cli: [v2] Distribusikan binari untuk alpine / musl libc

Dibuat pada 20 Nov 2019  ·  26Komentar  ·  Sumber: 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

Kesalahan dengan:

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

Komentar yang paling membantu

Alasan mengapa gambar adoptopenjdk berfungsi adalah karena mereka menyertakan pustaka glibc yang hilang. Alphine linux didasarkan pada 'musl glibc', alternatif ringan untuk glibc penuh. Binari aws cli v2 tidak bekerja dengan musl, mereka membutuhkan beberapa perpustakaan lagi untuk bekerja.

Alih-alih menggunakan image Java, Anda juga dapat menggunakan Dockerfile di bawah ini sebagai contoh cara menjalankan AWS CLI v2 di 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/*

Di atas akan mengunduh pustaka glibc, mengunduh dan menginstal AWS CLI v2, dan menghapus beberapa hal yang mungkin tidak kita perlukan, seperti pelengkapan otomatis. Gambar yang dihasilkan berukuran sekitar 100MB

Semua 26 komentar

Saya mencoba men-debug masalah, dan tidak tahu mengapa itu gagal. Bagi saya, skrip instal agak terkelupas. Saya mencoba menambahkan label v2 juga.

Binari yang kami terbitkan tidak akan berfungsi pada gambar buruh pelabuhan berdasarkan alpine karena kami mengompilasinya terhadap glibc. sh: aws2: not found adalah apa yang terjadi ketika Anda mencoba mengeksekusi biner ini. Jika Anda mencobanya pada gambar seperti ubuntu:latest penginstal akan bekerja.

Selain itu, saya rasa kami tidak akan pernah merilis biner yang kompatibel dengan alpine seperti yang kami lakukan untuk biner linux umum kami. Saya pikir kami akan lebih cenderung untuk hanya merilis gambar buruh pelabuhan yang datang dengan biner kami yang dibangun di atas alpine.

Terima kasih atas jawaban anda. Apakah mungkin untuk mendokumentasikannya di sini https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html di bawah "Prasyarat untuk Linux", atau membuat kesalahan lebih ramah pengguna di berbasis alpine kasus gambar?

Kami akan memastikan untuk memperbarui ini di panduan pengguna. Saya juga menyukai ide untuk membuat pesan kesalahan yang lebih ramah pengguna untuk kasus ini.

@joguSD mengecewakan, alpine adalah standar untuk gambar buruh pelabuhan. Terutama dengan sistem build / ci yang ingin mengotomatisasi & tidak ingin terus-menerus mengunduh gambar buruh pelabuhan yang sangat besar.

Dapat menggunakan gambar buruh pelabuhan alpine resmi dalam build multi-tahap untuk menyalin biner ke gambar buruh pelabuhan lain.

@chadgrant - dapatkah Anda memberikan contoh dockerfile multi-tahap Anda?

@BarakBD-Globality Saya tidak memilikinya tetapi jika gambar aws-alpine pernah dibuat, Anda bisa melakukan:

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

Sayang sekali mereka tidak mendukung alpine. Ini adalah gambar standar.

Selain itu, saya rasa kami tidak akan pernah merilis biner yang kompatibel dengan alpine seperti yang kami lakukan untuk biner linux umum kami. Saya pikir kami akan lebih cenderung untuk hanya merilis gambar buruh pelabuhan yang datang dengan biner kami yang dibangun di atas alpine.

@joguSD apakah sudah ada diskusi atau mosi tentang ini? Sepertinya masalah yang cukup besar mengingat prevalensi alpine. Orang-orang seperti saya menggunakan aws dalam cicd dan otomatisasi lainnya, jadi jika tidak tersedia untuk gambar berbasis alpine, menggunakan versi 2 bahkan bukan pilihan tanpa pekerjaan yang signifikan! Terima kasih.

juga tidak dapat menginstal di busybox

Menariknya jika Anda menggunakan ini sebagai gambar dasar, cli AWS akan diinstal dan berfungsi dengan baik.

DARI adoptopenjdk/openjdk11:alpine

Saya dapat melakukan ini menggunakan Dockerfile berikut

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

Alasan mengapa gambar adoptopenjdk berfungsi adalah karena mereka menyertakan pustaka glibc yang hilang. Alphine linux didasarkan pada 'musl glibc', alternatif ringan untuk glibc penuh. Binari aws cli v2 tidak bekerja dengan musl, mereka membutuhkan beberapa perpustakaan lagi untuk bekerja.

Alih-alih menggunakan image Java, Anda juga dapat menggunakan Dockerfile di bawah ini sebagai contoh cara menjalankan AWS CLI v2 di 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/*

Di atas akan mengunduh pustaka glibc, mengunduh dan menginstal AWS CLI v2, dan menghapus beberapa hal yang mungkin tidak kita perlukan, seperti pelengkapan otomatis. Gambar yang dihasilkan berukuran sekitar 100MB

Jadi apa jalur terpendek untuk menjalankan aws ecr get-login-password … | docker login … di dalam wadah buruh pelabuhan? (yang menyiratkan: docker:dind )?

Aku ingin menghindari untuk membangun sendiri saya docker:stable image dengan docker:dind dukungan. Setidaknya saya bisa berkat https://github.com/aws/aws-cli/issues/4685#issuecomment -615872019 solusi. Terima kasih untuk itu!

@bentolor Karena docker:dind juga menggunakan alpine, saya kira yang harus Anda lakukan hanyalah mengubah baris pertama dari Dockerfile yang disebutkan di atas. Alih-alih FROM alpine:3.11 Anda harus menggunakan FROM docker:dind . Itu berarti Anda sedang membangun citra Anda sendiri, meskipun ....

terima kasih @blagerweij bekerja dengan sangat baik

Juga terima kasih @blagerweij : Saya memahami jelatang dan membuat gambar buruh pelabuhan khusus publik dengan menyalin&menempelkan solusi Anda: https://hub.docker.com/r/bentolor/docker-dind-awscli

@bentolor Saya perhatikan di repo Anda bahwa Dockerfile Anda menggunakan FROM docker:stable alih-alih FROM docker:dind . Saya pikir intinya adalah membuat gambar untuk Docker di Docker dengan dukungan AWS?

@blagerweij Lihat gambar di bawah dari gambar Docker resmi untuk ilustrasi.

Penggunaan yang khas adalah:

  1. Satu (atau ci Anda) memulai instance docker:dind dan kemudian
  2. Memulai instance docker:stable yang ditautkan ke container docker:dind dimulai
  3. Anda mulai menjalankan perintah docker di dalam wadah kedua yang mengalihkan perintah melalui koneksi soket ke daemon buruh pelabuhan yang berjalan di dalam wadah docker:dind .

Oleh karena itu: Meskipun benar bahwa instance docker:dind akhirnya mengeksekusi perintah Docker Anda, frontend CLI Anda sebenarnya hidup dalam instance docker:stable . Dan di situlah seseorang yaitu perlu masuk ke AWS ;-)

Setidaknya ini adalah pola penggunaan yang saya ketahui (yaitu menggunakan Gitlab CI untuk membuat gambar buruh pelabuhan). Mungkin ada juga skenario penggunaan docker:dind ?

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

Seseorang dapat menggunakan gambar alpine dengan glibc dari https://hub.docker.com/r/frolvlad/alpine-glibc/
dan instal aws cli mengikuti langkah-langkah dari dokumentasi aws. Bekerja untuk saya.

@blagerweij Saya menggunakan skrip Anda dengan buruh pelabuhan di gambar buruh pelabuhan. aws cli berfungsi dengan baik. Saya baru saja mendapat kesalahan dalam membangun:
/usr/glibc-compat/sbin/ldconfig: /usr/glibc-compat/lib/ld-linux-x86-64.so.2 is not a symbolic link

@amiram Ya, saya juga menerima pesan itu, itu adalah peringatan yang bisa Anda abaikan: Ini mengharapkan symlink, tetapi file yang ada adalah file biasa. Lihat https://github.com/envoyproxy/envoy/issues/9078#issuecomment -576837432

Bisakah seseorang mengganti nama masalah ini menjadi sesuatu seperti: "Distribute binary for alpine/musl"?

@joguSD @jordanst3wart

Ya, saya senang dengan "Distribusikan binari untuk alpine / musl libc". Beri tahu saya jika Anda memiliki masalah

Saya hanya perlu aws s3 cp untuk proyek gairah, jadi saya baru saja menginstal awscli V1 dengan pip:

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

Alasan mengapa gambar adoptopenjdk berfungsi adalah karena mereka menyertakan pustaka glibc yang hilang. Alphine linux didasarkan pada 'musl glibc', alternatif ringan untuk glibc penuh. Binari aws cli v2 tidak bekerja dengan musl, mereka membutuhkan beberapa perpustakaan lagi untuk bekerja.

Alih-alih menggunakan image Java, Anda juga dapat menggunakan Dockerfile di bawah ini sebagai contoh cara menjalankan AWS CLI v2 di Alpine Linux:

menggunting

Di atas akan mengunduh pustaka glibc, mengunduh dan menginstal AWS CLI v2, dan menghapus beberapa hal yang mungkin tidak kita perlukan, seperti pelengkapan otomatis. Gambar yang dihasilkan berukuran sekitar 100MB

penyesuaian ini akan mengambil versi terbaru secara otomatis jika Anda tidak ingin membuat kode keras versi 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/*

Anda juga dapat menggunakan Dockerfile di bawah ini sebagai contoh cara menjalankan AWS CLI v2 di Alpine Linux:

Dockerfile/skrip yang disediakan berfungsi tetapi menampilkan kesalahan ini, yang sepertinya tidak mencegahnya berfungsi:

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

Anehnya, menjalankan apk add mandoc tepat sebelum aws/install menghindari menampilkan kesalahan ini, dan menghapus paket itu setelah menginstal tidak berdampak buruk. Paket acak lainnya tampaknya tidak memiliki efek perlindungan ini.

Ada pikiran?

PS apk add less diperlukan untuk aws help untuk bekerja dengan benar (itu akan mengeluh tentang paket groff hilang jika tidak).

Apakah halaman ini membantu?
0 / 5 - 0 peringkat