首页 > 解决方案 > 为什么我的 aws-cli 构建在构建时可以在中间容器上工作,但不能在最终容器上工作?

问题描述

我一直在尝试将 aws-cli 放在我拥有的基于 Alpine 的 docker 映像上。我在这里找到了包含 glibc 的适当库的提示,并且我能够在我的 docker build 上顺利运行。如果我在构建过程中从构建它的中间容器调用 aws 可执行文件,它就可以工作。

将 aws 二进制目录复制到目标后,所有文件都已传输,但 aws 可执行文件不再有效。我尝试从 CMD 或 docker exec 执行此操作,但我收到文件不存在的错误: 在此处输入图像描述

有谁知道发生了什么?

这是我开始使用的 docker repo: https ://hub.docker.com/r/alfg/nginx-rtmp/ 。我只是在 ffmpeg FROM 块之后粘贴下面的 aws cli 构建代码,并COPY --from=2在此问题中进一步添加该行。

这是 aws cli 的构建部分:

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

这是我的 Dockerfile 的最后一步,它复制文件并更新 PATH:

COPY --from=0 /usr/local/nginx /usr/local/nginx
COPY --from=0 /etc/nginx /etc/nginx
COPY --from=1 /usr/local /usr/local
COPY --from=1 /usr/lib/libfdk-aac.so.2 /usr/lib/libfdk-aac.so.2
COPY --from=2 /usr/local/aws-cli /usr/local/aws-cli

# Add NGINX path, AWS-CLI path, config and static files.
ENV PATH "${PATH}:/usr/local/nginx/sbin:/usr/local/aws-cli/v2/current/bin"
ADD nginx.conf /etc/nginx/nginx.conf.template
RUN mkdir -p /opt/data && mkdir /www
ADD static /www/static

EXPOSE 1935
EXPOSE 80

CMD envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < \
  /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf && \
  nginx

docker build 成功运行,我可以从映像启动容器。我还在aws s3 ls s3://my-public-bucketaws-cli 块末尾的 Dockerfile 中添加了类似的内容,并且在构建期间它们成功运行并且可以从 s3 中提取。

我在构建中唯一能看到错误的是下图中 - 它发生在 glibc/aws 构建期间,但构建仍然成功完成,之后二进制文件可以正常工作:

/usr/glibc-compat/sbin/ldconfig: /usr/glibc-compat/lib/ld-linux-x86-64.so.2 is not a symbolic link

/usr/glibc-compat/sbin/ldconfig:/usr/glibc-compat/lib/ld-linux-x86-64.so.2 不是符号链接

标签: amazon-web-servicesdockeraws-clialpine

解决方案


推荐阅读