18 个版本 (重大更改)

0.13.2 2024 年 8 月 15 日
0.13.1 2024 年 6 月 17 日
0.12.1 2024 年 5 月 21 日
0.10.0 2024 年 1 月 21 日
0.5.1 2023 年 7 月 11 日

#101 in Unix API

Download history 38/week @ 2024-04-27 53/week @ 2024-05-04 7/week @ 2024-05-11 152/week @ 2024-05-18 77/week @ 2024-05-25 208/week @ 2024-06-01 62/week @ 2024-06-08 181/week @ 2024-06-15 13/week @ 2024-06-22 18/week @ 2024-06-29 89/week @ 2024-07-06 44/week @ 2024-07-13 101/week @ 2024-07-20 26/week @ 2024-07-27 38/week @ 2024-08-03 112/week @ 2024-08-10

每月 277 次下载

MIT/Apache

170KB
3K SLoC

超级编排器

超级编排器的目的是作为一个比 bash 脚本和 docker-compose 更易于编程、可扩展和可调试的替代品。它基于 Tokio,并提供了方便的文件管理、命令运行和 Docker 容器管理工具。

首先,查看 stacked_errors 的文档(https://docs.rs/stacked_errors/latest/stacked_errors/)以了解错误策略。然后,查看文档。最后,按照以下顺序检查示例:路径、文件选项、基本命令、基本容器、命令、Dockerfile 入口点模式、PostgreSQL 和清理(注意,其中一些使用 UNIX 特定命令,在有些环境中可能无法成功运行)。

备注

"nix_support" 特性使一些函数能够向命令发送 UNIX 信号。

交叉编译

在 Windows 上进行交叉编译实际上是不可能的(相信我,我已经尝试过两次,只需使用 WSL 2 或 MSYS2)。使用交叉编译的 Dockerfile 入口点模式示例在直接 Windows 上将不会工作。然而,在容器内进行交叉编译是可能的,并且仍然可以通过挂载 CARGO_HOME 来快速重新编译构建工件。下面是一个示例:

if cfg!(windows) {
    Container::new(
            "builder",
            Dockerfile::contents(/* build container definition */),
        )
        .volume(
            home::cargo_home().stack()?.to_str().stack()?, // using the `home` crate
            "/root/.cargo", // if building in a typical Linux container
        )
        .volume(/* base directory */, "/needs_build")
        .workdir("/needs_build")
        .entrypoint_args(["sh", "-c", &format!("cargo -vV && {build_cmd}",)])
        .run(
            Some(/* dockerfiles_dir */),
            Duration::from_secs(3600),
            /* logs_dir */,
            true,
        )
        .await
        .stack()?
        .assert_success()
        .stack()?;
}

我会在 super_orchestrator 本身中包含执行此操作的功能,但在这个层面我们正在做太多的环境假设。如果本地使用的 cargo 版本和在构建容器中使用的版本不兼容,可能会出现问题。这最终必须按仓库自动完成,而 dockerfile_entrypoint_pattern 只是一个入门示例。

Docker 不一致性

通常情况下,Docker 在一致性和在不同环境中运行相同事物方面表现良好,但有一些事情有不同的默认设置(意味着在某一个环境中运行完美的事物可能在另一个环境中失败),其中最值得注意的是涉及网络访问的事物。

  • 当启用IPv6时,应使用以下参数
container.create_args([
    "--cap-add=NET_ADMIN", // if doing anything requiring admin access for network stuff
    "--sysctl",
    "net.ipv6.conf.all.disable_ipv6=0", // some environments need this also
    "--sysctl",
    "net.ipv6.conf.default.disable_ipv6=0", // some environments need this also
    "--sysctl",
    "net.ipv6.conf.all.forwarding=1", // for packet forwarding if needed
])
  • "--internal" 网络参数在某些平台上并没有达到预期的效果,即使在某些WSL 2 Linux发行版上也是如此。

依赖项

~7–16MB
~195K SLoC