我一直在try 为我的rust build创建一个Dockerfile,它允许我独立于依赖项构建应用程序,如下所示:
然而,这似乎并不适用于我,因为lib的工作树略有不同.rs文件.我的Dockerfile的布局如下:
FROM rust:1.60 as build
# create a new empty shell project
RUN USER=root cargo new --bin rocket-example-pro
WORKDIR /rocket-example-pro
# create dummy lib.rs file to build dependencies separately from changes to src
RUN touch src/lib.rs
# copy over your manifests
COPY ./Cargo.lock ./Cargo.lock
COPY ./Cargo.toml ./Cargo.toml
RUN cargo build --release --locked
RUN rm src/*.rs
# copy your source tree
COPY ./src ./src
# build for release
RUN rm ./target/release/deps/rocket_example_pro*
RUN cargo build --release --locked ## <-- fails
# our final base
FROM rust:1.60
# copy the build artifact from the build stage
COPY --from=build /rocket-example-pro/target/release/rocket_example_pro .
# set the startup command to run your binary
CMD ["./rocket_example_pro"]
正如您最初看到的,我复制了toml文件并执行了构建,与前面演示的类似.然而,由于我的项目 struct 略有不同,我似乎有一个问题,作为我的主要任务.rs几乎只有一行调用我库中的main方法.里布.rs也定义在我的toml文件中,该文件在构建依赖项之前被复制,并要求我touch 库.rs文件,以确保它不会在这里失败,否则就会丢失.
在第二个构建步骤中,我似乎无法解决这个问题,在我复制了实际的源文件来构建应用程序之后,我收到了错误消息
Compiling rocket_example_pro v0.1.0 (/rocket-example-pro)
error[E0425]: cannot find function `run` in crate `rocket_example_pro`
--> src/main.rs:3:22
|
3 | rocket_example_pro::run().unwrap();
| ^^^ not found in `rocket_example_pro`
当我自己在一个空目录中执行这些步骤时,我自己似乎没有遇到同样的错误,相反,最后一步成功了,但生成的rocket example pro可执行文件似乎仍然是仅打印"Hello world"的shell示例项目,而不是在第二次构建之前复制的rocket应用程序.
据我所知,第一个构建似乎正在影响第二个构建,也许当我触及lib时.rs文件在虚拟shell项目中,它不使用run()方法构建它?所以当第二个启动时,它没有看到run方法,因为它是空的?但这对我来说没有多大意义,因为我已经复制了lib.包含run()方法的rs文件.
下面是toml文件的样子,如果它有帮助的话:
[package]
name = "rocket_example_pro"
version = "0.1.0"
edition = "2021"
[[bin]]
name = "rocket_example_pro"
path = "src/main.rs"
[lib]
name = "rocket_example_pro"
path = "src/lib.rs"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
...