如何在Docker容器内构建Rust可执行文件?

问题描述 投票:2回答:2

我正在研究macOS机器,但我打算在Linux机器上运行我的可执行文件。我发现jimmycuadra/rust Docker图像似乎符合我的需要。

我在当前目录中使用以下Dockerfile执行docker build .

FROM jimmycuadra/rust

ADD my_project /my_project
WORKDIR /my_project
RUN cargo build --release --target=x86_64-unknown-linux-gnu

这似乎正确地构建了项目,但是一旦Docker退出,就没有target目录,并且没有任何正在运行的容器来自docker cp

如何在Docker容器内构建Rust可执行文件?

docker rust
2个回答
2
投票

我认为你通过使用Dockerfile使这里的事情过于复杂(如果你的需求实际上比你所展示的更复杂,我可能会错,如果有,请提供更多信息,我将编辑这个答案)。当您在Dockerfile中运行ADD时,您正在将代码复制到构建的映像中,但是您再也不会将构建的对象复制出来(事实上,我无法使用Dockerfile执行此操作)。没有“好的”方法可以将生成的二进制文件从图像中删除。

我认为像这个命令更简单的东西会更好地满足你的需求(在更改到包含你的代码的目录后运行它):

docker run -it -v "$(pwd):/source" jimmycuadra/rust cargo build --release --target=x86_64-unknown-linux-gnu

这将当前目录安装为容器中的/source(这是您正在使用的映像的默认WORKDIR),然后构建您的代码,这意味着生成的可执行文件将最终在当前文件夹中:

ls target/x86_64-unknown-linux-gnu/release/

这有一个小问题 - 容器中的所有内容都以root身份运行,因此在将所有者设置为root用户的情况下创建构建工件。这可能会导致您稍后尝试在主机上修改/删除它们时出现问题。为了解决这个问题,你可以使用这样的东西:

docker run -it -v "$(pwd):/source" jimmycuadra/rust sh -c "cargo build --release --target=x86_64-unknown-linux-gnu && chown -R $(id -u):$(id -g) ."

我说“可能”因为我不确定这是否适用于Mac。我确信有一种方法可以实现同样的目的。


0
投票

您可以直接在Docker Hub上运行Rust开发团队提供的映像,并将源目录安装在映像中。您只需要小心安装Cargo将用作缓存的目录,否则它将最终下载软件包和/或检查每个新容器运行的依赖项的源存储库。请注意,您不应该绑定安装整个/usr/local/cargo目录,因为这是官方图像放置二进制文件和其他东西的地方。

这是我作为cargo放在我的可执行文件路径中的小shell脚本,并且也作为nightly-cargo符号链接:

#!/bin/sh

if [ $(basename "$0") = nightly-cargo ]; then
    rust_image=rustlang/rust:nightly
else
    rust_image=rust:latest
fi

echo "Running cargo in $rust_image"

docker run -t --rm --user $(id -u):$(id -g) \
    -v "$HOME"/.cargo/registry:/usr/local/cargo/registry \
    -v "$HOME"/.cargo/git:/usr/local/cargo/git \
    -v "$PWD":/mnt/crate --workdir /mnt/crate \
    $rust_image cargo "$@"

更新:我已经设置了一个自动重建的image repository,允许用户绑定安装整个/usr/local/cargo。需要注意的是,在使用/usr/local/cargo绑定安装的运行其中一个图像的容器内运行生锈可能会产生令人惊讶的结果。

© www.soinside.com 2019 - 2024. All rights reserved.