如何构建包含本地依赖项的 docker 镜像?

问题描述 投票:0回答:3

如何构建包含本地依赖项的 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 rust rust-cargo
3个回答
2
投票

你给出的路径会被docker解释为容器内的路径,所以不存在是正常的。

您也无法复制 Dockerfile 目录中不存在的文件。

在 crates.io 上发布你的库,或者通过 git url(即:github)提供它,可以与 Cargo 一起安装。

或者将库复制到本地,以便您可以将其复制到容器中。


1
投票

当然,您还必须将本地依赖项复制到容器中。 如果我没记错的话,docker 对于绝对路径的工作效果不太好,所以我将

api_libs
文件夹移动到
external
文件夹中,并将
Cargo.toml
调整为:

api_libs = {path = "./api_libs/"}

现在当我们复制时

COPY . .

我们也复制依赖项,因此

docker build .
成功了。

顺便说一句,你的第一个

COPY ./Cargo.toml ./Cargo.lock ./
是多余的,因为
COPY . .
无论如何都会复制它们,而你在中间什么也不做。


0
投票

在我的情况下,结构如下所示(同一工作区中的二进制+ 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
添加到构建上下文中以解决依赖关系。

© www.soinside.com 2019 - 2024. All rights reserved.