跳至内容

容器

容器,如Docker,是一种将软件及其依赖项打包成标准化单元以进行软件开发的方式。容器是轻量级、独立且可执行的软件包,包含运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。

要求

GenAIScript 使用 Docker 来编排容器。

启动容器

首先创建并启动一个新容器。GenAIScript将按需拉取容器镜像,在不再需要时移除该容器。

const container = await host.container()

自定义图像

默认情况下,容器使用python:alpine镜像,它提供了一个最小的python环境。您可以使用image选项来更改镜像。

const container = await host.container({ image: "node:20" })

构建镜像

使用 docker build 创建可重复使用的镜像。

您可以通过在脚本中使用单个命令从GitHub仓库构建自定义镜像。

const repo = "codelion/optillm" // GitHub repository = image name
const branch = "main"
const dir = "."
await host.exec(
`docker build -t ${repo} https://github.com/${repo}.git#${branch}:${dir}`
)

然后使用该仓库作为您的镜像名称

const container = await host.container({ image: repo, ... })

禁用自动清理

默认情况下,容器在不再需要时会被移除。您可以使用persistent选项禁用此行为。

const container = await host.container({ persistent: true })

启用网络

默认情况下,容器网络是禁用的,网络请求将无法工作。这是最安全的解决方案;如果需要安装额外的软件包,建议创建一个包含所有必要软件的镜像。

您可以通过networkEnabled启用网络访问。

const container = await host.container({ networkEnabled: true })

端口绑定

您可以将容器端口绑定到主机端口,从而访问在容器内运行的Web服务器。

例如,这个配置会将主机的8088端口映射到容器的80端口, 您就可以通过http://localhost:8088/访问本地Web服务器。

const container = await host.container({
networkEnabled: true,
ports: {
containerPort: "80/tcp",
hostPort: 8088,
}, // array also supported
})

然后

运行命令

您可以使用exec方法在容器中运行命令。它会返回退出码、标准输出和错误流。

const { stdout } = await container.exec("python", ["--version"])

读取和写入文件

该容器在主机文件系统中挂载了一个卷,允许对容器进行文件的读写操作。

await container.writeText("hello.txt", "Hello, world!")
const content = await container.readText("hello.txt")

将文件复制到容器中

您也可以将文件从主机复制到容器中。

// src/* -> ./src/*
await container.copyTo("src/**", ".")

断开网络连接

如果您创建容器时启用了网络,可以断开网络以隔离该容器。

await container.disconnect()

在工具中使用容器

容器化工具指南展示了如何在工具中使用容器来安全地处理不可信文本。