我有点困惑容器是如何运行的。我在Mac上开发,当我把编译过的源代码复制到Docker映像和Debian操作系统时,我得到一个错误,文件不能被执行。我在谷歌上搜索了一下,它与不同的CPU架构有关,我需要交叉编译。这是有道理的。
这一点无论如何行得通:
FROM rust:1.65 AS builder
WORKDIR app
COPY . .
RUN cargo build --release
FROM debian:buster-slim
COPY --from=builder ./app/target/release/hello ./app/myapp
CMD ["./app/myapp"]
我可以构建一个二进制文件,而不需要事先知道我是为哪个架构编译的,对吗?这是因为我只是在一个名为rust:1.65
的构建器上做了一个cargo build
。我很好奇它是如何知道它将在Debian和正确的CPU上运行的。FROM rust:1.65
是如何为正确的架构编译的?或者它只是一个Dockerfile中的所有相同的默认架构?
2条答案
按热度按时间jm81lzqq1#
您可以针对给定的体系结构进行编译。
运行以下命令查看所有目标可用. doc
并在Toml配置中设置buil选项。doc
mdfafbf12#
哪个 * 操作系统 *(可能)比哪个 * 处理器架构 * 更重要。
Docker核心并不能在MacOS上运行。Docker Desktop运行一个隐藏的Linux虚拟机。如果你在主机上编译二进制文件,你会得到一个MacOS二进制文件,但是你试图在一个Linux容器中运行它,这会导致一个错误。如果你也在一个容器中编译,那就完全是Linux。
更普遍的是,在共享库、支持文件、权限等方面也存在潜在的问题,除非你对自己的工作很有信心,否则我不会尝试在主机上构建二进制文件并将它们复制到映像或容器中。在映像中安装它们,要么自己编译,要么使用基础映像发行版的软件包管理器。