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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:15:01