Wave 容器
摘要
Wave 允许按需供应容器镜像,从而无需手动构建并上传到容器注册表。
由 Wave 供应的容器既可以是可丢弃的,即仅可在短时间内访问的临时容器,也可以是常规的长期存储在注册表中的容器镜像。
功能
- 认证对远程容器注册表的访问;
- 增强容器镜像,即向现有镜像动态添加一个或多个容器层;
- 针对给定的容器文件(又称 Dockerfile)按需构建容器镜像;
- 基于一个或多个 Conda 包按需构建容器镜像;
- 基于一个或多个 CRAN/R 包按需构建容器镜像;
- 为指定的目标平台(目前为 linux/amd64 和 linux/arm64)构建容器镜像;
- 将构建好的容器推送并缓存到用户提供的容器仓库;
- 使用 Singularity 规范文件、Conda 包或 CRAN 包构建 Singularity 原生容器;
- 将 Singularity 原生容器镜像推送到符合 OCI 标准的注册表;
- 扫描容器镜像以检测安全漏洞
工作原理
容器供应请求通过端点 POST /container-token 提交,指定目标容器镜像或容器文件。该端点返回由 Wave 供应的容器名称,可通过常规 Docker 客户端或任何符合 Docker registry v2 API 的其他容器客户端进行访问。
当请求一个一次性容器时,Wave 充当 Docker 客户端与目标容器 注册表之间的代理服务器。它对容器清单进行插桩,按需添加用户提交请求中指定的新层。 然后,pull 流程由 Docker 客户端像处理任何其他容器一样进行管理,基础镜像层从 存储该镜像的容器注册表下载,而经过插桩的层则通过 Wave 服务下载。
要求
- Java 21 或更高版本
- Linux 或 macOS
- Redis 6.2(或更高版本)
- Docker 引擎(用于开发)
- Kubernetes 集群(用于生产)
快速开始
-
从 GitHub 克隆 Wave 仓库:
git clone https://github.com/seqeralabs/wave && cd wave -
根据您需要访问的目标注册表,定义一个或多个上述环境变量对:
export DOCKER_USER="<Docker registry user name>" export DOCKER_PAT="<Docker registry access token or password>" export QUAY_USER="<Quay.io registry user name or password>" export QUAY_PAT="<Quay.io registry access token>" export AWS_ACCESS_KEY_ID="<AWS ECR registry access key>" export AWS_SECRET_ACCESS_KEY="<AWS ECR registry secret key>" export AZURECR_USER="<Azure registry user name>" export AZURECR_PAT="<Azure registry access token or password>" -
设置一个本地隧道,以便 Docker 客户端能够访问 Wave 服务(仅在 macOS 上运行时需要):
npx localtunnel --port 9090
然后在您的环境中使用 Local tunnel 返回的域名配置以下变量,例如
```bash
export WAVE_SERVER_URL="https://sweet-nights-report.loca.lt"
```
4. 在您的计算机上运行该服务:
```
bash run.sh
```
4. 使用 curl 工具向 Wave 服务提交容器请求
```bash
curl \
-H "Content-Type: application/json" \
-X POST $WAVE_SERVER_URL/container-token \
-d '{"containerImage":"ubuntu:latest"}' \
| jq -r .targetImage
```
5. 使用上一条命令返回的名称拉取容器镜像,例如
```bash
docker pull sweet-nights-report.loca.lt/wt/617e7da1b37a/library/ubuntu:latest
```
注意 您可以使用 Wave 命令行工具 代替
curl与 Wave 服务进行交互并提交更复杂的请求。
调试
-
要调试由代理客户端发出的 http 请求,请添加以下 Jvm 设置:
'-Djdk.httpclient.HttpClient.log=requests,headers'
TypeSpec API 规范
-
你可以在 typespec 目录中使用 (typespec)[https://github.com/microsoft/typespec] 找到 API 规范。使用以下命令生成 API 规范。
'cd typespec' 'tsp install' 'tsp compile .' -
检查
typespec/tsp-output目录中的生成的 API 规范。