amazon-web-services - 为什么我的 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-bucket
aws-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
解决方案
推荐阅读
- java - 为什么单元测试断言在 Gradle 5.1 上失败,但在 1.12 上通过,两者都使用相同的 Java 版本 1.8?
- sql - 即使星期一是从上个月开始,如何获取第一个工作日的开始日期?
- r - R:循环读取列表中的多个 Excel 文件
- typescript - 如何保留两种类型都存在的键?
- docker - 如何将 docker 变量传递给 jboss-cli.sh?
- c# - 动态设置 DevExpress Sunburst 中心标签的文本
- python-3.x - Python If 语句返回 ValueError
- visual-studio - .NET Core / IIS Express / 无法启动进程'MySite.exe' 403 Forbidden (Q&A)
- url - 更新 github.io 域并从旧 github.io 域重定向(最简洁的方法)
- django - Python Django Display Nested Objects