在Docker容器中构建Rust后,如何获取Rust可执行文件?

时间:2016-11-11 19:51:41

标签: docker rust

我正在研究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可执行文件?

2 个答案:

答案 0 :(得分: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。我确信有办法实现同样的目标。

答案 1 :(得分:0)

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

以下是我在可执行文件路径中放置nightly-cargo的小shell脚本,并且还符号链接为#!/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 "$@"

/usr/local/cargo

已更新:我已设置自动重建Can Jsoup simulate a button press?,允许用户绑定安装整个/usr/local/cargo。需要注意的是,在运行// In your User model public function units() { return $this->hasManyThrough(Unit::class, Building::class); } 绑定装置的这些图像之一的容器内运行生锈可能会产生令人惊讶的结果。