
如何用 docker/compose Go SDK 在自己的程序中加载 Compose 项目并启动服务【免费下载链接】composeDefine and run multi-container applications with Docker项目地址: https://gitcode.com/GitHub_Trending/compose/composedocker/compose除了作为 Compose CLI 的核心还可以以 Go 库的形式被第三方程序引入让你在代码里加载 Compose 文件、校验并管理多容器应用而不依赖 Compose CLI 二进制。本文解决的问题是在自己的 Go 程序中读取一个compose.yaml加载成项目对象并把其中定义的服务启动起来。前提是你的程序能访问 Docker daemonSDK 通过 Docker API 完成实际操作并能在工作目录中定位到 Compose 文件。完整依据来自仓库文档 docs/sdk.md配套的示例源码在 docs/examples/sdk/main.go 和 docs/examples/sdk/options.go。准备条件一个可访问的 Docker daemon。SDK 实例initializes a service with the necessary configuration to interact with the Docker daemon见 docs/sdk.md没有可用 daemon 时创建服务或启动都会失败。一个 Compose 文件下文的示例使用工作目录下的compose.yaml可按实际路径替换。Go 程序需要引入两个模块的包以示例代码的 import 块为准见 docs/examples/sdk/main.gogithub.com/docker/cli用于创建并初始化 Docker CLI 句柄子包为cli/command和cli/flagsgithub.com/docker/compose/v5子包为pkg/api和pkg/compose加载项目并启动服务完整示例下面这段代码是 docs/sdk.md 中Example usage一节给出的示例与 docs/examples/sdk/main.go 逐字一致仓库用测试保证两者不漂移。其中ConfigPaths的compose.yaml和ProjectName的my-app需要替换为你实际的文件路径和项目名其余部分可直接使用package main import ( context log github.com/docker/cli/cli/command github.com/docker/cli/cli/flags github.com/docker/compose/v5/pkg/api github.com/docker/compose/v5/pkg/compose ) func main() { ctx : context.Background() dockerCLI, err : command.NewDockerCli() if err ! nil { log.Fatalf(Failed to create docker CLI: %v, err) } err dockerCLI.Initialize(flags.ClientOptions{}) if err ! nil { log.Fatalf(Failed to initialize docker CLI: %v, err) } // Create a new Compose service instance service, err : compose.NewComposeService(dockerCLI) if err ! nil { log.Fatalf(Failed to create compose service: %v, err) } // Load the Compose project from a compose file project, err : service.LoadProject(ctx, api.ProjectLoadOptions{ ConfigPaths: []string{compose.yaml}, ProjectName: my-app, }) if err ! nil { log.Fatalf(Failed to load project: %v, err) } // Start the services defined in the Compose file err service.Up(ctx, project, api.UpOptions{ Create: api.CreateOptions{}, Start: api.StartOptions{}, }) if err ! nil { log.Fatalf(Failed to start services: %v, err) } log.Printf(Successfully started project: %s, project.Name) }示例的操作路径分四步每一步都有 error 检查失败即退出command.NewDockerCli()dockerCLI.Initialize(flags.ClientOptions{})创建并初始化 Docker CLI 句柄它是后续传给 Compose 服务的依赖。compose.NewComposeService(dockerCLI)创建 Compose 服务实例接口为api.Compose定义在 pkg/api/api.go实现入口在 pkg/compose/compose.go 的NewComposeService。service.LoadProject(ctx, api.ProjectLoadOptions{...})从 Compose 文件加载项目。ProjectLoadOptions除示例用到的两个字段外还支持WorkingDir、EnvFiles、Profiles、Services把加载范围限定到指定服务及其依赖等字段字段说明可查 pkg/api/api.go 中ProjectLoadOptions的注释ProjectName为空时项目名从目录推断。service.Up(ctx, project, api.UpOptions{Create: ..., Start: ...})执行等价于compose up的操作UpOptions由Create和Start两组选项组成。可选定制服务行为NewComposeService()接受可选的compose.Option参数来定制行为完整选项列表见 docs/sdk.md 的Available options一节示例代码见 docs/examples/sdk/options.go// Create a custom output buffer to capture logs var outputBuffer bytes.Buffer // Create a compose service with custom options service, err : compose.NewComposeService(dockerCLI, compose.WithOutputStream(outputBuffer), // Redirect output to custom writer compose.WithErrorStream(os.Stderr), // Use stderr for errors compose.WithMaxConcurrency(4), // Limit concurrent operations compose.WithPrompt(compose.AlwaysOkPrompt()), // Auto-confirm all prompts )文档给出的可用选项包括WithOutputStream(io.Writer)/WithErrorStream(io.Writer)/WithInputStream(io.Reader)/WithStreams(out, err, in)重定向 I/O 流WithMaxConcurrency(int)限制对 Docker API 的并发操作数WithPrompt(Prompt)定制交互确认行为非交互环境用AlwaysOkPrompt()自动确认所有提示WithDryRun以 dry-run 模式运行不实际应用变更WithContextInfo(api.ContextInfo)设置自定义 Docker context 信息WithProxyConfig(map[string]string)为 build 配置 HTTP 代理WithEventProcessor(api.EventProcessor)接收进度事件和操作通知。可选用 EventProcessor 跟踪操作进度如果不传WithEventProcessor事件会被静默丢弃。要监控up等操作的实时进度实现api.EventProcessor接口定义在github.com/docker/compose/v5/pkg/api它有三个回调Start(ctx, operation)Compose 操作开始时调用On(events...)资源级别的进度事件例如镜像拉取、容器启动Done(operation, success)操作完成时调用带成功与否的结果。事件状态类型有Working进行中、Done成功完成、Warning带警告完成、Error失败常见的状态文本包括Creating、Created、Starting、Started、Running、Stopping、Stopped、Removing、Removed、Building、Built、Pulling、Pulled等。CLI 使用的渲染器位于github.com/docker/compose/v5/cmd/display包可以直接复用display.Full(out, info io.Writer, detached bool)带进度条的交互式终端 UICompose CLI 的默认输出display.Plain(out io.Writer)适合非交互环境或日志文件的纯文本进度display.JSON(out io.Writer)把每个事件渲染为一个 JSON 对象display.Quiet()静默丢弃事件与不设置时的行为相同。如何验证启动成功文档示例给出的判定方式有两层每一步调用创建 CLI、初始化、创建服务、LoadProject、Up都返回error示例在非 nil 时用log.Fatalf退出——任一环节失败程序会立刻报错终止不会走到最后。全部成功后示例打印log.Printf(Successfully started project: %s, project.Name)这是文档示例展示的成功标志日志。如果使用了EventProcessor还可以用Done(operation, success)回调中的success值判断整个操作的结果并用各事件的Working/Done/Warning/Error状态定位具体是哪个资源失败。限制不传WithEventProcessor时SDK 产生的事件全部静默丢弃程序侧感知不到中间进度。示例代码是package main的最小入口集成到已有程序时dockerCLI句柄和NewComposeService的返回值api.Compose应作为服务复用而不是每次操作都重新创建。UpOptions中的Create/Start选项传零值即使用默认行为本文不展开各字段的细节需要时查阅 pkg/api/api.go。【免费下载链接】composeDefine and run multi-container applications with Docker项目地址: https://gitcode.com/GitHub_Trending/compose/compose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考