Aws-cli: [v2] 为 alpine / musl libc 分发二进制文件

创建于 2019-11-20  ·  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

最有用的评论

Adoptopenjdk 镜像工作的原因是因为它们包含缺少的 glibc 库。 Alphine linux 基于“musl glibc”,它是成熟 glibc 的轻量级替代品。 aws cli v2 二进制文件不适用于 musl,它们需要更多的库才能工作。

除了使用 Java 映像,您还可以使用下面的 Dockerfile 作为如何在 Alpine Linux 上运行 AWS CLI v2 的示例:

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,并删除一些我们可能不需要的东西,例如自动完成。 生成的图像大小约为 100MB

所有26条评论

我试图调试这个问题,但无法弄清楚它为什么会失败。 在我看来,安装脚本有点不稳定。 我也尝试添加 v2 标签。

我们发布的二进制文件不适用于基于alpine docker 镜像,因为我们正在针对 glibc 编译它们。 sh: aws2: not found是您尝试执行此二进制文件时发生的情况。 如果您在ubuntu:latest之类的图像上尝试它,安装程序将起作用。

此外,我认为我们永远不会像我们为一般的 linux 二进制文件所做的那样发布与 alpine 兼容的二进制文件。 我认为我们更倾向于发布一个 docker 映像,该映像随我们在 alpine 上构建的二进制文件一起提供。

感谢您的回答。 是否可以在https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html下“Linux 的先决条件”下记录,或者在基于 alpine 的情况下使错误更加用户友好图片案例?

我们将确保在用户指南中更新此内容。 我也喜欢为这种情况制作更用户友好的错误消息的想法。

@joguSD 无赖,alpine 是

可以在多阶段构建中使用官方的 alpine docker 镜像将二进制文件复制到另一个 docker 镜像中。

@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

太糟糕了,他们不支持高山。 这是一个标准的图像。

此外,我认为我们永远不会像我们为一般的 linux 二进制文件所做的那样发布与 alpine 兼容的二进制文件。 我认为我们更倾向于发布一个 docker 映像,该映像随我们在 alpine 上构建的二进制文件一起提供。

@joguSD对此有任何讨论或动议吗? 考虑到高山的流行,这似乎是一件大事。 像我这样的人在他们的 cicd 和其他自动化中使用aws ,所以如果它不适用于基于 alpine 的图像,那么如果没有大量工作,使用版本 2 甚至不是一个选项! 谢谢。

也不能安装在busybox

有趣的是,如果您将其用作基础映像,AWS cli 将安装并正常工作。

从采用openjdk/openjdk11:alpine

我能够使用以下 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

Adoptopenjdk 镜像工作的原因是因为它们包含缺少的 glibc 库。 Alphine linux 基于“musl glibc”,它是成熟 glibc 的轻量级替代品。 aws cli v2 二进制文件不适用于 musl,它们需要更多的库才能工作。

除了使用 Java 映像,您还可以使用下面的 Dockerfile 作为如何在 Alpine Linux 上运行 AWS CLI v2 的示例:

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,并删除一些我们可能不需要的东西,例如自动完成。 生成的图像大小约为 100MB

那么在运行的 docker 容器中获取aws ecr get-login-password … | docker login …的最短路径是什么? (这意味着: docker:dind )?

我很想避免在docker:dind支持下构建我自己的docker:stable图像。 至少我要感谢https://github.com/aws/aws-cli/issues/4685#issuecomment -615872019 解决方案。 感谢那!

@bentolor由于docker:dind也使用 alpine,我怀疑您所要做的就是更改上述 Dockerfile 的第一行。 您应该使用FROM docker:dind而不是FROM alpine:3.11 FROM docker:dind 。 不过,这确实意味着您正在建立自己的形象......

谢谢@blagerweij工作得很好

还要感谢@blagerweij :我抓住了荨麻并通过复制和粘贴您的解决方案构建了一个公共的自定义 docker 图像: https :

@bentolor我在你的 repo 中注意到你的 Dockerfile 使用FROM docker:stable而不是FROM docker:dind 。 我认为重点是在具有 AWS 支持的 Docker 中为 Docker 创建映像?

@blagerweij请参阅下面来自官方 Docker 图像的图像以进行说明。

典型的用法是:

  1. 一个(或您的 ci)启动一个docker:dind实例,然后
  2. 启动一个单独的docker:stable实例,该实例链接到启动的docker:dind容器
  3. 您开始在第二个容器内执行docker命令,该命令通过套接字连接将 comamnds 重定向到在第一个docker:dind容器内运行的 docker 守护进程。

因此:虽然docker:dind实例最终会执行您的 Docker 命令,但您的 CLI 前端实际上位于docker:stable实例中。 这就是 ie 需要登录 AWS 的地方;-)

至少这是我所知道的使用模式(即使用Gitlab CI构建docker:dind使用场景?

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

可以使用来自https://hub.docker.com/r/frolvlad/alpine-glibc/ 的带有 glibc 的 alpine 图像
并按照 aws 文档中的步骤安装 aws cli。 为我工作。

@blagerweij我将您的脚本与
/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,所以我刚刚用 pip 安装了 awscli V1:

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

Adoptopenjdk 镜像工作的原因是因为它们包含缺少的 glibc 库。 Alphine linux 基于“musl glibc”,它是成熟 glibc 的轻量级替代品。 aws cli v2 二进制文件不适用于 musl,它们需要更多的库才能工作。

除了使用 Java 映像,您还可以使用下面的 Dockerfile 作为如何在 Alpine Linux 上运行 AWS CLI v2 的示例:

剪断

以上将下载 glibc 库,下载并安装 AWS CLI v2,并删除一些我们可能不需要的东西,例如自动完成。 生成的图像大小约为 100MB

如果您不想硬编码 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 作为如何在 Alpine Linux 上运行 AWS CLI v2 的示例:

提供的 Dockerfile/script 工作但显示此错误,这似乎并没有阻止它工作:

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

奇怪的是,运行apk add mandoc之前aws/install避免出现这种故障,并删除该程序包安装没有任何不良影响后。 随机其他包好像没有这个保护作用。

有什么想法吗?

PS apk add less需要aws help才能正常工作(否则它会抱怨缺少包groff )。

此页面是否有帮助?
0 / 5 - 0 等级