docker-dind-awscli icon indicating copy to clipboard operation
docker-dind-awscli copied to clipboard

Image does not build on other architectures than x86_64

Open bakousylla opened this issue 3 years ago • 16 comments

Hello,

I get this error /usr/local/bin/aws: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory if I try to generate an image with your dockerfile, do you have any idea what the problem might be ? Thanks for your help

bakousylla avatar Nov 09 '21 10:11 bakousylla

@bakousylla Which command triggers this error?

bentolor avatar Nov 09 '21 10:11 bentolor

@bakousylla Still, please provide me the aws command which triggered this error.

Anyway: I just uploaded a new version of the tool including the mentioned library. Can you check if this resolves your issue?

bentolor avatar Nov 09 '21 10:11 bentolor

I'have the same issue /usr/local/bin/aws: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory after pulling your modif

bakousylla avatar Nov 09 '21 11:11 bakousylla

@bakousylla So please advise: Which cmmand triggers this error?

bentolor avatar Nov 09 '21 11:11 bentolor

when I just try to build image


(base) ➜  docker-dind-awscli git:(master) docker build -t test:latest "."
Sending build context to Docker daemon  83.46kB
Step 1/4 : FROM docker
 ---> 4844bf2dfb03
Step 2/4 : ENV GLIBC_VER=2.34-r0
 ---> Using cache
 ---> 74a32c499b12
Step 3/4 : RUN apk --update-cache add         binutils         curl         groff         bash         zlib     && sed -i 's/ash/bash/g' /etc/passwd     && 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 del libc6-compat     && apk add         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 -q 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/*     && docker --version     && aws --version
 ---> Running in 8f977920758b
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/aarch64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/aarch64/APKINDEX.tar.gz
(1/10) Installing readline (8.1.0-r0)
(2/10) Installing bash (5.1.4-r0)
Executing bash-5.1.4-r0.post-install
(3/10) Installing libgcc (10.3.1_git20210424-r2)
(4/10) Installing libstdc++ (10.3.1_git20210424-r2)
(5/10) Installing binutils (2.35.2-r2)
(6/10) Installing brotli-libs (1.0.9-r5)
(7/10) Installing nghttp2-libs (1.43.0-r0)
(8/10) Installing libcurl (7.79.1-r0)
(9/10) Installing curl (7.79.1-r0)
(10/10) Installing groff (1.22.4-r1)
Executing busybox-1.33.1-r3.trigger
OK: 34 MiB in 32 packages
(1/1) Purging libc6-compat (1.2.2-r3)
OK: 34 MiB in 31 packages
(1/2) Installing glibc (2.34-r0)
(2/2) Installing glibc-bin (2.34-r0)
Executing glibc-bin-2.34-r0.trigger
/usr/glibc-compat/sbin/ldconfig: /usr/lib/libtls.so.2.0.3 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libcrypto.so.1.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libssl.so.1.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libtls.so.2 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libbrotlienc.so.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libbrotlidec.so.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libbrotlicommon.so.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libreadline.so.8.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libbrotlidec.so.1.0.9 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libctf.so.0 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libopcodes-2.35.2.so is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libctf-nobfd.so.0.0.0 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libbfd-2.35.2.so is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libnghttp2.so.14 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libnghttp2.so.14.20.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libstdc++.so.6.0.28 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libbrotlicommon.so.1.0.9 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libctf-nobfd.so.0 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libstdc++.so.6 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libcurl.so.4 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libbrotlienc.so.1.0.9 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libreadline.so.8 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libgcc_s.so.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libctf.so.0.0.0 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libcurl.so.4.7.0 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libpanelw.so.6.2 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libpanelw.so.6 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libformw.so.6.2 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libncursesw.so.6 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libedit.so.0 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libformw.so.6 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libmenuw.so.6 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libncursesw.so.6.2 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libedit.so.0.0.64 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libmenuw.so.6.2 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /lib/libz.so.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /lib/libcrypto.so.1.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /lib/libssl.so.1.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /lib/libz.so.1.2.11 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /lib/libapk.so.3.12.0 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /lib/ld-musl-aarch64.so.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /lib/libc.musl-aarch64.so.1 is for unknown machine 183.

OK: 41 MiB in 33 packages
/aws/dist/aws: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory
You can now run: /usr/local/bin/aws --version
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/aarch64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/aarch64/APKINDEX.tar.gz
(1/5) Purging binutils (2.35.2-r2)
(2/5) Purging curl (7.79.1-r0)
(3/5) Purging libcurl (7.79.1-r0)
(4/5) Purging brotli-libs (1.0.9-r5)
(5/5) Purging nghttp2-libs (1.43.0-r0)
Executing busybox-1.33.1-r3.trigger
Executing glibc-bin-2.34-r0.trigger
/usr/glibc-compat/sbin/ldconfig: /usr/lib/libtls.so.2.0.3 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libcrypto.so.1.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libssl.so.1.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libtls.so.2 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libreadline.so.8.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libstdc++.so.6.0.28 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libstdc++.so.6 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libreadline.so.8 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libgcc_s.so.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libpanelw.so.6.2 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libpanelw.so.6 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libformw.so.6.2 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libncursesw.so.6 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libedit.so.0 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libformw.so.6 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libmenuw.so.6 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libncursesw.so.6.2 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libedit.so.0.0.64 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /usr/lib/libmenuw.so.6.2 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /lib/libz.so.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /lib/libcrypto.so.1.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /lib/libssl.so.1.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /lib/libz.so.1.2.11 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /lib/libapk.so.3.12.0 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /lib/ld-musl-aarch64.so.1 is for unknown machine 183.

/usr/glibc-compat/sbin/ldconfig: /lib/libc.musl-aarch64.so.1 is for unknown machine 183.

OK: 30 MiB in 28 packages
Docker version 20.10.10, build b485636
/usr/local/bin/aws: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory
The command '/bin/sh -c apk --update-cache add         binutils         curl         groff         bash         zlib     && sed -i 's/ash/bash/g' /etc/passwd     && 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 del libc6-compat     && apk add         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 -q 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/*     && docker --version     && aws --version' returned a non-zero code: 127

bakousylla avatar Nov 09 '21 11:11 bakousylla

It seems that you are trying to build this image on aarch64 architecture, right?

Your main issue is, that currently the Dockerfile downloads & installs the x86_64 build of the glibc library set.

I found an open issue upstream there asking for an arm port: https://github.com/sgerrand/alpine-pkg-glibc/issues/126

Maybe this approach to build a container without GLIBC works on aarm64? : https://github.com/aws/aws-cli/issues/4685#issuecomment-788657890

bentolor avatar Nov 09 '21 11:11 bentolor

you are right, I have the arm root:xnu-7195.141.6~3/RELEASE_ARM64_T8101 arm64, I'll try your solution without GLIBC, thanks a lot

bakousylla avatar Nov 09 '21 11:11 bakousylla

I think I got it working with GLIBC on ARM by installing GLIBC from SatoshiPortal, which also provides them for aarch64. Afterwards you also have to install the aarch64 version of the awscli. Here is my Dockerfile for reference:

FROM alpine:3.14

ARG AWS_CLI_VERSION=2.3.6

ARG GLIBC_ARCH=aarch64
ARG GLIBC_VERSION=2.33-r0

#
# System tools and dependencies
RUN set -e \
    && apk add --no-cache \
        binutils \
        curl \
        groff \
    && rm -rf /var/cache/apk/* /tmp/*

#
# Install glibc (required for awscli)
RUN set -e \
    && cd /tmp \
    && GLIBC_KEY="https://github.com/SatoshiPortal/alpine-pkg-glibc/releases/download/${GLIBC_VERSION}/[email protected]" \
    && GLIBC_URL='https://github.com/SatoshiPortal/alpine-pkg-glibc/releases/download' \
    && curl -sL ${GLIBC_KEY} -o /etc/apk/keys/[email protected] \
    && curl -sLO ${GLIBC_URL}/${GLIBC_VERSION}/glibc-${GLIBC_VERSION}-${GLIBC_ARCH}.apk -o glibc-${GLIBC_VERSION}.apk \
    && curl -sLO ${GLIBC_URL}/${GLIBC_VERSION}/glibc-bin-${GLIBC_VERSION}-${GLIBC_ARCH}.apk -o glibc-bin-${GLIBC_VERSION}.apk \
    && curl -sLO ${GLIBC_URL}/${GLIBC_VERSION}/glibc-i18n-${GLIBC_VERSION}-${GLIBC_ARCH}.apk -o glibc-i18n-${GLIBC_VERSION}.apk \
    && apk add --update --no-cache *.apk; \
        /usr/glibc-compat/bin/localedef -i en_US -f UTF-8 en_US.UTF-8 \
    && apk del --purge glibc-i18n \
    && rm -rf /var/cache/apk/* /tmp/*

#
# Install awscli2
RUN set -e \
    && curl -sL https://awscli.amazonaws.com/awscli-exe-linux-${GLIBC_ARCH}-${AWS_CLI_VERSION}.zip -o awscliv2.zip \
    && unzip -q awscliv2.zip \
    && aws/install; \
        aws --version \
    && rm -f awscliv2.zip

WORKDIR /app
CMD ["/bin/sh"]

You can switch between aarch64 and amd64 by changing the BUILD_ARG to x86_64. Hoping this helps someone!

Ic3w0lf avatar Nov 18 '21 12:11 Ic3w0lf

@Ic3w0lf Awesome. Thanks for you contribution.

If I find a feasible easy way to crosscompile for other architectures I might adopt your example into my build and start publishing for additional architectures, too.

Just our of curiosity: What is you motivation for a aarch64? Raspberry Pi? Apple M1? Any new server plattform?

bentolor avatar Nov 18 '21 13:11 bentolor

@bentolor Super glad this is helpful :) My main motivation is Apple M1 in this case. I don't have any Apple Silicon myself, but wanted to provide this container as multiarch build for my colleagues who often go with M1 (especially in the future).

I couldn't really test in-depth if this works but asked a friend who is on M1 if he could quickly run aws --version in this container and he reported it works! :crossed_fingers:

Looking forward to see you try out other architectures as well! What architectures do you have in mind?

Ic3w0lf avatar Nov 18 '21 15:11 Ic3w0lf

@Ic3w0lf Thanks for your insights.

To be honest: You issue showed me my ignorance regarding alternative platforms. Till now in IT we just developed for x86 and that was it. The latest moves in the market (ARM-based M1 & server hardware) and given that the list of supported architecture has grown quite a lot for popular open-source projects, I wondered which other architectures I should keep in mind for Docker workloads.

Looking on the linked list I think windows-amd64 might be potentially relevant, too.

But it seems we are both driven by the same interest in being prepared for upcoming trends. I just resurrected my old Raspberry Pi 3B and installed an aarch64 version of ubuntu on it so I can test your Dockerfile.

bentolor avatar Nov 18 '21 15:11 bentolor

@bentolor Thank you for insights as well!

I agree with you. Until now it has pretty much been amd64 or nothing but I am really glad that Apple is heating up the architecture debate. Even though I am not an Apple fan I love the competition they bring into the game :)

And please let me know if awscli works as expected on a native arm system once you get to it!

Cheers and have a great evening!

Ic3w0lf avatar Nov 18 '21 17:11 Ic3w0lf

Hitting the same error. Haven't yet attempted the workaround, but wondering if there were any updates on a cross compiled option?

david-AH avatar Oct 28 '22 02:10 david-AH

@david-AH just for my "census": Which architectures are you missing? Unfortunately this needs to be tackled individually per plattform right now.

bentolor avatar Oct 28 '22 10:10 bentolor

Apple M1 -> arm64

david-AH avatar Oct 28 '22 10:10 david-AH

Okay, after I realized cross-building is quite simple usine QEmu, I did a first run, but failed to succeed. You can see my efforts at https://github.com/bentolor/docker-dind-awscli/tree/experimental/aarch64 and there is a BUILD.md describing what needs to be done to get the build running.

Unfortunately the build fails with errors like

/usr/glibc-compat/sbin/ldconfig: /usr/glibc-compat/lib/ld-linux-aarch64.so.1 is not a symbolic link

OK: 32 MiB in 28 packages
Docker version 20.10.21, build baeda1f
/usr/local/bin/aws: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory

Not sure what's the culprit here. I also had to downgrade the glibc version as the source does not provide newer builds.

bentolor avatar Oct 28 '22 16:10 bentolor