如何构建包含本地依赖项的 Rust 项目的 Docker 镜像?
我的
Cargo.toml
看起来像这样:
[package]
name = "backend"
version = "0.1.0"
edition = "2021"
[dependencies]
actix-web = "4"
juniper = "0.15.10"
my_libs = {path = "/Users/dev/projects/api/api_libs/"}
还有我的
Dockerfile
:
FROM rust:1.60.0-slim-buster as builder
WORKDIR /app
ENV CARGO_HOME=/workdir/.cargo
COPY ./Cargo.toml ./Cargo.lock ./
COPY . .
RUN cargo build --release
当我运行 docker build 时,出现以下错误:
错误:无法获取
my_libs
作为包 backend v0.1.0 (/app)
的依赖项
我该如何解决这个问题?
你给出的路径会被docker解释为容器内的路径,所以不存在是正常的。
您也无法复制 Dockerfile 目录中不存在的文件。
在 crates.io 上发布你的库,或者通过 git url(即:github)提供它,可以与 Cargo 一起安装。
或者将库复制到本地,以便您可以将其复制到容器中。
当然,您还必须将本地依赖项复制到容器中。 如果我没记错的话,docker 对于绝对路径的工作效果不太好,所以我将
api_libs
文件夹移动到 external
文件夹中,并将 Cargo.toml
调整为:
api_libs = {path = "./api_libs/"}
现在当我们复制时
COPY . .
我们也复制依赖项,因此
docker build .
成功了。
顺便说一句,你的第一个
COPY ./Cargo.toml ./Cargo.lock ./
是多余的,因为 COPY . .
无论如何都会复制它们,而你在中间什么也不做。
在我的情况下,结构如下所示(同一工作区中的二进制+ lib),其中
some_app
对shared
中的
./some_app/Cargo.toml:
具有本地依赖关系
shared = { path = "../shared"}
.
├── 一些_应用程序
│ ├── Cargo.lock
│ ├── Cargo.toml
│ ├── Dockerfile
│ └── src
├── 货物锁
├── Cargo.toml
├── 分享
├── Cargo.toml
└── 源\
我只是从工作区目录运行 docker build 并在
Dockerfile
:中指定
./some_app/Dockerfile
的路径
docker build -t my_app -f some_app/Dockerfile
因此将
some_app
和 shared
添加到构建上下文中以解决依赖关系。