一旦在Docker容器内构buildRust可执行文件,我该如何获取Rust可执行文件?

我正在使用macOS机器,但是我打算在Linux机器上运行我的可执行文件。 我find了适合我需求的jimmycuadra / rust Docker镜像。

我做docker build . 与当前目录下面的Dockerfile。

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

这似乎正确地build立了项目,但一旦Docker退出,没有target目录,并且没有运行容器从docker cp

一旦在Docker容器中构buildRust可执行文件,我该如何获取它?

我认为你有一个Dockerfile(这可能是错误的,如果你的需求实际上比你所显示的更复杂,如果有的话请提供更多的信息,我将编辑这个答案)在这里。 当您在Dockerfile中运行ADD时,您将代码复制到构build的映像中,但是您绝不会将构build的对象再次复制(事实上,我无法使用Dockerfile来执行此操作)。 没有“好”的方法来从图像中得到结果二进制文件。

我觉得像这个命令更简单,更适合您的需要(更改到包含您的代码的目录后运行它):

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

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

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

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

 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上运行。 我相信有一种方法可以实现同样的事情。

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

下面是我作为cargo放在我的可执行文件path中的小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 "$@" 

更新:我build立了一个自动重build的镜像库 ,允许用户绑定整个/usr/local/cargo 。 需要注意的是,在运行/usr/local/cargo绑定这些映像的容器中运行rustup可能会产生令人惊讶的结果。