我是 Docker 新手。我想容器化一个小环境,以便可以运行可执行文件,但我陷入困境,因为我什至无法运行可执行文件。
我的文件夹结构如下所示:
example/
|-Dockerfile
|-hello_world
我的Dockerfile
看起来像这样:
# Use Alpine Linux as the base image
FROM alpine:latest
# Set the working directory inside the container
WORKDIR /app
# Copy the executable to the container
COPY hello_world /app/
# Set the permissions for the executable
RUN chmod +x /app/hello_world
# Define the command to run your server when the container starts
ENTRYPOINT ["/app/hello_world"]
然后我运行:
> sudo docker build -t example .
> sudo docker run --name example_container example
结果是这样的:
exec /app/hello_world: no such file or directory
我已经尝试了尽可能多的变体,尝试在 Dockerfile 中使用CMD
,RUN
和 ,ENTRYPOINT
但都具有相同的结果,即图像无法在根目录下的应用程序文件夹中找到 hello_world 程序。
我真的很困惑,因为我在我的普通 Ubuntu 操作系统上尝试过这个,我在根目录中放置了一个测试文件夹,然后在hello_world
其中放置了一个,并且似乎工作得很好,我可以使用这个绝对路径从任何地方运行它。
/app/hello_world
是一个可执行文件,它是 Rust 代码的编译部分。当我/app/hello_world
在 Ubuntu 机器上的 shell 中运行时,它工作正常。
stable-x86_64-unknown-linux-gnu 工具链/rustc 1.71.0
有人可以告诉我我做错了什么吗?
您看到“没有这样的文件或目录”错误的原因是因为系统正在寻找嵌入在
.interp
ELF 二进制文件部分中的路径。对于在 glibc 下编译的二进制文件,如下所示:在您的 Alpine 图像中,没有
/lib64/ld-linux-x86-64.so.2
,这就是导致错误消息的原因。以 C 二进制文件为例,如果我从以下内容开始:
并在我的 glibc 系统上编译它,然后尝试在 Alpine 下运行它,我们看到:
如果我们提供预期的解释器,如下所示:
我们收到一个新错误:
如果我们提供必要的共享库:
然后命令按预期工作:
根据我收到的评论,对于任何希望使用 Rust 和 Alpine 执行此操作的人来说,这里有一个答案。
正如所指出的,问题来自于尝试使用默认值
x86_64-unknown-linux-gnu
来编译 Rust 二进制文件。相反,编译x86_64-unknown-linux-musl
并特别使用:rustup target add x86_64-unknown-linux-musl
其次是:
cargo build --release --target=x86_64-unknown-linux-musl
然后将这个新的二进制文件而不是旧的二进制文件添加到项目中,现在 Alpine 就可以正常运行它了。