You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TestContainers .NET C#从ImageFromDockerfileBuilder创建容器

使用TestContainers构建镜像后创建运行容器

你已经成功构建了本地镜像,接下来可以通过以下两种方式用这个镜像创建并运行容器:

方式一:使用GenericContainer直接指定镜像

IFutureDockerImage 的 Reference 属性会返回构建好的镜像标识(名称或ID),你可以把它传给 GenericContainer 来创建容器:

// 构建镜像(你的原有代码)
var image = new ImageFromDockerfileBuilder()
    .WithDockerfileDirectory(CommonDirectoryPath.GetSolutionDirectory(), string.Empty)
    .WithDockerfile("Dockerfile")
    .Build();

await image.CreateAsync().ConfigureAwait(false);

// 创建并启动容器
using var container = new GenericContainer(image.Reference)
    .WithPortBinding(8080, 80) // 绑定宿主机端口到容器端口,根据你的应用调整
    .WithWaitStrategy(Wait.ForHttp("/health").ForPort(80)); // 等待应用就绪的策略,按需调整

await container.StartAsync().ConfigureAwait(false);

// 这里可以添加你的测试逻辑,比如调用容器内的API
var baseUrl = $"http://localhost:{container.GetMappedPublicPort(80)}";
// ... 测试代码

// 容器会在using块结束后自动停止并清理

方式二:使用ContainerBuilder结合构建好的镜像

也可以用 ContainerBuilder 来更灵活地配置容器,通过 WithImage 传入构建好的 IFutureDockerImage:

// 构建镜像(你的原有代码)
var image = new ImageFromDockerfileBuilder()
    .WithDockerfileDirectory(CommonDirectoryPath.GetSolutionDirectory(), string.Empty)
    .WithDockerfile("Dockerfile")
    .Build();

await image.CreateAsync().ConfigureAwait(false);

// 用ContainerBuilder创建容器
var containerBuilder = new ContainerBuilder()
    .WithImage(image)
    .WithPortBinding(8080, 80)
    .WithWaitStrategy(Wait.ForHttp("/health").ForPort(80));

using var container = containerBuilder.Build();
await container.StartAsync().ConfigureAwait(false);

// 执行测试逻辑
var baseUrl = $"http://localhost:{container.GetMappedPublicPort(80)}";
// ... 测试代码

关键说明

  • IFutureDockerImage.Reference 是构建后镜像的唯一标识,TestContainers会自动处理镜像的引用。
  • WithWaitStrategy 很重要,它确保容器内的应用完全启动后再执行测试,避免因应用未就绪导致的失败。
  • 使用 using 块包裹容器实例,能自动在结束时停止并销毁容器,避免资源泄漏。

内容的提问来源于stack exchange,提问作者smk081

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:34:58