gpt4 book ai didi

docker - 编译一个容器化的rust应用程序以在树莓派4(arm64/armv8)上运行。无法执行 “No such file or directory”

转载 作者:行者123 更新时间:2023-12-03 11:38:11 25 4
gpt4 key购买 nike

我正在尝试在树莓派(raspberry pi 4)集群(k3s,docker)上运行rust应用程序(服务器)。我可以使用buildx成功编译我的docker镜像,并在针对arm64架构时在树莓派上运行它
例如:docker buildx build --load --platform=linux/arm64 -t myrepo/myapp:arm-0.0.1 .将dockerfile命令设置为CMD ["echo", "hi i'm working!"],回显“嗨,我在工作!”如预期的那样。很好,因为我知道buildx可以正常工作。
当试图使Rust在容器中作为可执行文件工作时,我的问题就来了,以下是我的dockerfile

FROM rust as builder
ARG APP_NAME="app"
ARG TARGET="x86_64-unknown-linux-musl"
ARG GITHUB_SSH_KEY=""
RUN apt-get update
RUN apt-get install musl-tools gcc-aarch64-linux-gnu gcc-arm-linux-gnueabihf -y
RUN rustup target add $TARGET;
RUN mkdir /usr/src/$APP_NAME
WORKDIR /usr/src/$APP_NAME

ENV CARGO_NET_GIT_FETCH_WITH_CLI=true

COPY Cargo.toml Cargo.lock ./
COPY ./src ./src

RUN mkdir .cargo
RUN if [ "$TARGET" = "armv7-unknown-linux-gnueabihf" ]; then printf '\n\n[target.armv7-unknown-linux-gnueabihf] \nlinker = "arm-linux-gnueabihf-gcc"' >> .cargo/config.toml; fi
RUN if [ "$TARGET" = "aarch64-unknown-linux-gnu" ]; then printf '\n\n[target.aarch64-unknown-linux-gnu] \nlinker = "aarch64-linux-gnu-gcc"' >> .cargo/config.toml; fi

RUN mkdir /root/.ssh/
RUN echo "$GITHUB_SSH_KEY" > /root/.ssh/id_rsa;
RUN chmod 400 /root/.ssh/id_rsa
RUN ssh-keyscan -H github.com >> /etc/ssh/ssh_known_hosts

RUN cargo build --release --target=$TARGET
RUN groupadd -g 10001 -r $APP_NAME
RUN useradd -r -g $APP_NAME -u 10001 $APP_NAME

# ------------------------------------------------------------------------------
# Final Stage
# ------------------------------------------------------------------------------

FROM scratch
ARG APP_NAME="app"
ARG TARGET="x86_64-unknown-linux-musl"
WORKDIR /user/local/bin/
COPY --from=0 /etc/passwd /etc/passwd
COPY --from=builder /usr/src/$APP_NAME/target/$TARGET/release/$APP_NAME ./app
USER $APP_NAME

ENTRYPOINT ["./app"]
如您所见,我可以通过build args更改目标,并出于盲目的绝望而尝试了armv7,aarch64甚至x86_64。它们全部构建都没有错误。在运行期间,x86_64可以预期地失败,并出现典型的“exec格式错误”。但是,在armv7和aarch64中,错误均为“无此文件或目录”。我执行了该容器,可以看到可执行文件在那里,但是,我无法运行它们。当我检查armv7容器中的文件时,得到以下输出

ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=211fd9297da768ce435048457849b0ae6b22199a, with debug_info, not stripped


希望有人可以告诉我我要去哪里错了,因为到目前为止,我无法让该应用在pi集群上运行容器化。我找不到关于如何实现我正在尝试的功能的有用文档,因此我想尝试在这里提出。任何帮助或见识将不胜感激!
需要注意的一件事是,所有这些程序都可以编译并且可以很好地运行,而无需交叉编译位,因此我确定应用程序本身可以正常工作。
同样在这一点上进行测试,我只是试图运行一个简单的“世界,你好!”应用程序。

最佳答案

您在x86_64上仅使用musl。如果您不使用musl并且不禁用标准库,那么rust应用程序将动态依赖于系统libc。该库在临时docker容器中不存在。因此,要么使用一个确实包含libc副本(如alpine)的最小容器,要么从头开始构建一个包含libc及其依赖项的容器,或者在所有体系结构上使用musl。
通过对容器中的可执行文件运行ldd工具,您应该能够看到所需的库。
ARM 上的musl的目标字符串为:armv7-unknown-linux-musleabihfaarch64-unknown-linux-musl

关于docker - 编译一个容器化的rust应用程序以在树莓派4(arm64/armv8)上运行。无法执行 “No such file or directory”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65864484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com