Skip to content

feat(networks): add isolated Docker project networks#304

Draft
fuchencong wants to merge 2 commits into
mainfrom
feat/docker-named-networks
Draft

feat(networks): add isolated Docker project networks#304
fuchencong wants to merge 2 commits into
mainfrom
feat/docker-named-networks

Conversation

@fuchencong

@fuchencong fuchencong commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Summary

  • replace the removed singular network project option with Compose-style named networks, per-agent attachments, expose, and loopback-default ports
  • keep the existing single-bridge deployment compatible, while allowing additional managed Docker bridge networks only with a local Docker Engine and a native or host-networked daemon
  • create, validate, reconcile, expose runtime state for, and safely clean project-owned Docker networks; preserve isolation by attaching each sandbox only to its declared networks
  • persist effective sandbox network intent so sticky sandboxes are reused across metadata-only project revisions and replaced when the effective network configuration changes
  • add API, normalization, runtime, cleanup, integration, coverage-shape, and real Docker E2E coverage for connectivity, isolation, topology gates, port publication, recreation, and cleanup

Testing

  • GOFLAGS=-buildvcs=false go test ./...
  • GOFLAGS=-buildvcs=false task lint GO_BUILD_CACHE_DIR="$GOCACHE" GOLANGCI_LINT_CACHE_DIR="$GOLANGCI_LINT_CACHE" — 0 issues
  • GOFLAGS=-buildvcs=false task build GO_BUILD_CACHE_DIR="$GOCACHE"
  • task test GO_BUILD_CACHE_DIR="$GOCACHE"
    • Unit: 75.51%
    • Integration: 62.76%
    • E2E: 60.94%
    • Combined: 77.90%
  • AGENT_COMPOSE_REPO_ROOT="$PWD" bash ../../data/ai_analyse/ai-test-suit/suit-docker-network/test/bin/run.sh — 29/29 cases passed, with no leftover suite containers or networks

Checklist

  • Documentation updated when behavior or configuration changed.
  • Tests added or updated for user-visible behavior.
  • No secrets, private endpoints, internal certificates, or local runtime state included.

@monkeyscan

monkeyscan Bot commented Jul 15, 2026

Copy link
Copy Markdown

PR Title: feat(networks): add isolated Docker project networ...

Commit: 04c201c

本 PR 引入了隔离式 Docker 项目网络(isolated Docker project networks)功能,核心改动包括:

  1. 网络配置规范化:新增 pkg/compose/network_config.go,支持 networksexposeports 字段的解析、校验与规范化。仅支持 bridge 驱动和 TCP 协议。

  2. 网络规划与运行时管理:新增 pkg/networks/plan.gopkg/driver/docker_network.go,实现多网络模式(multi-network)与单桥模式(single-bridge)的网络规划、创建、容器附加及端口绑定。

  3. 项目网络清理:新增 pkg/agentcompose/adapters/project_networks.go,在删除项目时按历史版本清理由 agent-compose 管理的 Docker 网络。

  4. API 与模型扩展:Protobuf 与内部模型新增网络相关字段;SandboxHandler 支持返回 NetworkState

  5. 集成点projects.ControllerRemoveProject 中调用网络清理;runs 模块在准备沙箱时构建 NetworkIntent

整体架构清晰,测试覆盖较全。但在 IPv6 地址处理、网络清理的健壮性以及端口规范化逻辑上存在可改进之处。

Comment thread pkg/agentcompose/adapters/project_networks.go
items = append(items, item)
}
return items, nil
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

normalizePublishedPort 对 IPv6 地址格式化错误导致下游解析失败

net.ParseIP 接受 IPv6 地址(如 ::12001:db8::1),但函数随后用 fmt.Sprintf("%s:%d:%d/%s", hostIP, hostPort, containerPort, protocol) 格式化时未对 IPv6 地址加方括号。这将生成类似 ::1:8080:8080/tcp 的字符串,与 IPv6 地址语法冲突,导致下游 mergeDockerNetworkPortConfig: 分割时解析失败。

Problem code:

Changed code at pkg/compose/network_config.go:85

Recommendation:
在格式化前检查 net.ParseIP 返回的 IP 是否为 IPv6;如果是,应使用 [<ipv6>] 包裹,或直接拒绝 IPv6 地址(与当前仅支持 bridge/TCP 的设计保持一致)。同时更新 mergeDockerNetworkPortConfig 的解析逻辑以兼容带方括号的 IPv6。

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mokeyscan 当前解析路径不会生成评论中的错误 canonical 字符串:normalizePublishedPort 先按冒号拆分且只接受 1~3 段,因此无方括号或带方括号的 IPv6 都会在进入 net.ParseIP 和格式化之前被拒绝。当前配置与下游 canonical 格式有意只支持 IPv4,文档也未承诺 IPv6。17cf623 已补充两种 IPv6 写法均被拒绝的回归测试;未来若支持 IPv6,需要连同 bracketed 语法和下游解析一起设计。

@monkeyscan

monkeyscan Bot commented Jul 15, 2026

Copy link
Copy Markdown

PR Title: feat(networks): add isolated Docker project networ...

Commit: 17cf623

本次变更包含三部分:

  1. pkg/agentcompose/adapters/project_networks.go:在 CleanupProjectNetworks 清理流程中,对 NetworkInspectContainerInspect 返回的 NotFound 错误增加了 continue 跳过处理;同时对 NetworkDisconnectNetworkRemove 的 NotFound 错误进行了忽略,以容忍并发 Docker 清理导致资源在操作间隙被删除的情况。
  2. pkg/agentcompose/adapters/project_networks_test.go:为上述容错逻辑补充了单元测试 TestDockerProjectNetworkCleanerIgnoresConcurrentNotFound,覆盖网络已删除、容器已删除、端点已断开、网络在 inspect 后被删除四种并发场景。
  3. pkg/compose/network_config_test.go:新增了两个 IPv6 发布端口格式的测试用例,验证无括号和有括号 IPv6 地址均被正确拒绝。

整体设计合理:对并发删除的容错处理避免了清理流程因竞态条件而中断,测试覆盖完整。IPv6 端口测试用例与现有测试风格一致。未发现引入新缺陷或回归风险。

@innomentats
innomentats marked this pull request as draft July 17, 2026 09:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant