#golem #registry #docker-image #networking #companion #vm #builder

app gvmkit-build

用于构建Golem网络使用的gvmi镜像的工具。Golem注册表的伴随应用程序

3个版本

0.3.10 2023年6月18日
0.3.9 2023年6月17日
0.3.8 2023年6月17日

#8 in #companion

GPL-3.0许可证

110KB
2.5K SLoC

gvmkit-build

作为Golem注册表的伴随应用程序使用的Golem VM镜像构建器: https://registry.golem.network

要求

需要运行docker引擎。工具支持Linux、Windows和macOS。注意,在macOS ARM版本中,使用--platform linux/amd64选项进行docker构建。

安装

您可以使用pip安装gvmkit-build(需要python3和pip安装器)

pip install gvmkit-build

或从npm安装(需要npm安装)

npm install -g gvmkit-build

或使用cargo安装(需要Rust工具链,由于从源代码编译,所以有点慢)

cargo install gvmkit-build

或从github发布页面下载预构建版本

https://github.com/golemfactory/gvmkit-build-rs/releases

或从源代码构建,您可以在target/release/gvmkit-build(或Windows上的gvmkit-build.exe)中找到二进制文件

cargo build --release

镜像

Golem网络使用gvmi镜像作为创建VM的任务的基础。这些镜像基本上是squashfs镜像,附带一些元数据。可以使用此(gvmkit-build)工具从docker镜像准备这些镜像。

命名镜像

工具以主参数接受docker镜像名称。

Docker镜像ID由最多三部分组成: <username>/<image_name>:tag 它也可以是例如 <image_name>(tag默认为最新版)

以下命令将在当前目录中构建镜像并创建*.gvmi文件

gvmkit-build <docker_image_id>

如果本地不存在镜像,工具会尝试从docker hub拉取它。

要成功将镜像添加到注册门户,您必须相应地命名镜像或使用

gvmkit-build <user_name>/<image_name>:<tag> --push

或如果您的本地镜像名称不兼容,使用

gvmkit-build <docker_image_id> --push-to <user_name>/<image_name>:<tag>

构建过程简要说明

工具正在创建新的容器,并将数据从给定的镜像复制到新容器中。复制完成后,在工具容器中使用mksquashfs命令创建squashfs镜像。在添加元数据后,创建*.gvmi文件,并删除工具容器。请注意,工具镜像将保留在您的计算机上以供将来使用(它非常小,所以不用担心磁盘空间)

[可选] - 构建 squashfs-tools 镜像

如果您想使用自己的工具而不从Docker Hub拉取:请进入squashfs-tools目录并运行

docker build . -t my_squash_fs_builder

将环境变量添加到运行gvmkit-build的文件夹中的.env文件中

SQUASHFS_IMAGE_NAME=my_squash_fs_builder 

用于管理Docker镜像和容器,使用了bollard库。https://docs.rs/bollard/latest/bollard/

解决登录到注册门户的问题

该工具使用https://registry.golem.network作为默认的注册门户。您可以通过设置环境变量REGISTRY_URL来更改此行为。您应该在注册门户上创建账户并为您的用户生成访问令牌。如果您真的不想创建账户,可以使用匿名上传(见下文关于匿名上传的部分)。

当指定了--login --push或--push-to选项时,工具会要求登录。

用于存储登录信息的是rpassword库:https://docs.rs/crate/rpassword/latest

在"gvmkit-build-rs/default"下只保存一个登录/令牌实例。因此,如果您使用新的用户/令牌对登录,旧的配对将被遗忘。

此选项将要求登录到注册门户

gvmkit-build --login

您可以使用命令来检查您的登录信息是否正确

gvmkit-build --login-check 

如果您想忘记您的登录信息,可以使用它,这将清除您的登录信息

gvmkit-build --logout 

上述命令是可选的,因为如果您使用--push或--push-to选项,您将自动被要求登录。

在某些系统中,当没有提供安全的存储时,您将被迫使用以下方法来保存登录/令牌对。您可以选择将它们放在工作目录的.env文件中,以便更方便。如果您在使用共享机器上使用它,请记住设置适当的文件权限(chmod 600 .env)。

REGISTRY_USER=<username-in-registry-portal>
REGISTRY_TOKEN=<access-token-generated-in-registry-portal>

当REGISTRY_USER/REGISTRY_TOKEN在环境变量中设置时,不会使用安全的rpassword存储。

上传到多个标签

该工具无法上传到多个标签,但您可以使用不同的标签多次调用它。所有操作步骤都会被缓存,因此无需担心多次重新上传相同的文件。

上传大文件

该工具使用分块上传,默认分块大小为10MB(不建议更改)。默认创建四个上传工作进程(您可以根据您的网络条件使用--upload-workers参数增加/减少工作进程的数量)。如果您认为上传已卡住,您始终可以停止并重新运行工具以完成下载。只有尚未上传的块才会再次上传。

注意:块的总数限制设置为1000(因此默认为10GB)。如果您想上传更大的文件,必须相应地设置更大的块大小。

不登录上传镜像

您可以匿名上传镜像。请注意,这种镜像的有效期有限,它们可能在一段时间后未经通知从注册门户中删除。

cargo run --release -- <image_name> --push --nologin

不构建部分上传镜像

如果您确信您有合适的*.gvmi文件,例如my-test.gvmi,您可以使用

gvmkit-build --direct-file-upload my-test.gvmi --push-to <user_name><image_name>/<tag>

或匿名上传

gvmkit-build --direct-file-upload my-test.gvmi --push --nologin

在创建镜像时更改squashfs选项

您可以通过更改mksquashfs中使用的压缩来生成更紧凑或不那么紧凑的镜像。

查找帮助以获取更多信息。请注意,目前Golem Network不支持zstd(您可以使用xz来创建更紧凑的镜像)。

gvmkit-build --help

依赖项

~24–43MB
~663K SLoC