如何通过Docker.DotNet获取容器ContainerState以访问StartedAt属性
如何通过Docker.DotNet访问容器的ContainerState获取StartedAt属性
问题描述
我正尝试通过Docker.DotNet获取容器的StartedAt属性,目前能通过容器的Status属性获取运行时长,但发现Docker.DotNet.Models.ContainerState类可直接获取StartedAt等容器状态信息,请问如何访问容器的ContainerState?
现有代码:
DockerClient client = new DockerClientConfiguration(new Uri("npipe://./pipe/docker_engine")).CreateClient(); Task<IList<ContainerListResponse>> t = client.Containers.ListContainersAsync( new ContainersListParameters() { Limit = 10, }); t.Wait(); IList<ContainerListResponse> r = t.Result; foreach (var item in r) { if (item.Status.IndexOf("up", StringComparison.InvariantCultureIgnoreCase) == -1) { Console.WriteLine($"{item.Names[0]}- The process is not currently running. {item.State}"); } else { Console.WriteLine($"{item.Names[0]}- The process is running. {item.State}"); } } Console.ReadLine();
项目中的ContainerState类定义:
namespace Docker.DotNet.Models { [DataContract] public class ContainerState { [DataMember(Name = "Status", EmitDefaultValue = false)] public string Status { get; set; } [DataMember(Name = "Running", EmitDefaultValue = false)] public bool Running { get; set; } [DataMember(Name = "Paused", EmitDefaultValue = false)] public bool Paused { get; set; } [DataMember(Name = "Restarting", EmitDefaultValue = false)] public bool Restarting { get; set; } [DataMember(Name = "OOMKilled", EmitDefaultValue = false)] public bool OOMKilled { get; set; } [DataMember(Name = "Dead", EmitDefaultValue = false)] public bool Dead { get; set; } [DataMember(Name = "Pid", EmitDefaultValue = false)] public long Pid { get; set; } [DataMember(Name = "ExitCode", EmitDefaultValue = false)] public long ExitCode { get; set; } [DataMember(Name = "Error", EmitDefaultValue = false)] public string Error { get; set; } [DataMember(Name = "StartedAt", EmitDefaultValue = false)] public string StartedAt { get; set; } [DataMember(Name = "FinishedAt", EmitDefaultValue = false)] public string FinishedAt { get; set; } [DataMember(Name = "Health", EmitDefaultValue = false)] public Health Health { get; set; } } }
解决方案
默认ListContainersAsync返回的ContainerListResponse仅包含简化的状态字符串(即你当前用到的item.State),并不包含完整的ContainerState对象。要获取完整状态信息,需针对每个容器ID调用GetContainerAsync方法,该方法返回的ContainerResponse类包含State属性,类型正是ContainerState,可直接访问StartedAt等属性。
修改后的完整代码(建议使用异步语法替代同步Wait):
using System; using System.Collections.Generic; using System.Threading.Tasks; using Docker.DotNet; using Docker.DotNet.Models; class Program { static async Task Main(string[] args) { DockerClient client = new DockerClientConfiguration(new Uri("npipe://./pipe/docker_engine")).CreateClient(); IList<ContainerListResponse> containers = await client.Containers.ListContainersAsync( new ContainersListParameters() { Limit = 10, }); foreach (var container in containers) { // 获取容器详细信息,包含完整的ContainerState ContainerResponse containerDetails = await client.Containers.GetContainerAsync(container.ID); ContainerState state = containerDetails.State; if (!state.Running) { Console.WriteLine($"{container.Names[0]}- 容器未运行。退出码:{state.ExitCode},停止时间:{state.FinishedAt}"); } else { Console.WriteLine($"{container.Names[0]}- 容器正在运行。启动时间:{state.StartedAt}"); } } Console.ReadLine(); } }
关键点说明
GetContainerAsync(container.ID):通过容器ID获取完整的容器元数据,其中State属性就是你需要的ContainerState实例。- 直接使用
state.Running判断运行状态,比解析字符串更可靠。 - 可以直接访问
state.StartedAt、state.FinishedAt等属性,无需从Status字符串中提取信息。
内容的提问来源于stack exchange,提问作者weePee
相关产品推荐
相关产品推荐

