我一直试图创建一个 Dockerfile,使得我可以像这里演示的那样单独构建应用程序而不涉及依赖项:
Cache Rust dependencies with Docker build
然而,对于我来说似乎并没有起作用,因为我的工作树与 lib.rs 文件略有不同。我的 Dockerfile 布局如下:
在一个空目录中执行这些步骤时,我似乎没有遇到同样的错误,而是最后一步成功了,但生成的rocket-example-pro可执行文件仍然似乎只是打印“Hello world”的shell示例项目,而不是我在第二次构建之前复制的rocket应用程序。
据我所知,第一次构建影响了第二次构建,也许是因为当我触摸虚拟shell项目中的lib.rs文件时,它会构建它而没有run()方法?因此,当第二个启动时,它看不到run方法,因为它是空的?但这对我来说没有多大意义,因为我已经复制了包含run()方法的lib.rs文件。
如果有帮助,这是toml文件的内容:
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文件并执行了构建,这与之前演示的方式类似。然而,由于我的项目结构略有不同,我似乎遇到了问题,因为我的 main.rs 实际上只有一行代码,调用了 lib.rs 中的 main 方法。lib.rs 也在我的 Toml 文件中定义,并在构建依赖项之前进行了复制,这要求我修改 lib.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应用程序。
据我所知,第一次构建影响了第二次构建,也许是因为当我触摸虚拟shell项目中的lib.rs文件时,它会构建它而没有run()方法?因此,当第二个启动时,它看不到run方法,因为它是空的?但这对我来说没有多大意义,因为我已经复制了包含run()方法的lib.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]
...