Dockerのビルドのレスポンスを整形して出力する

F#でDockerイメージをビルドする - locabloではレスポンスをそのまま出力していたのでパースして出力できるようにしました。

F#っぽいコードにならなかったのが残念…

let formatResponse line =
    let root = JObject.Parse(line)
    let hasProp key =
        root.Properties()
        |> Seq.map (fun x -> x.Name)
        |> Seq.contains key
    let valueOf (key : string) = string root.[key]

    let newLine = System.Environment.NewLine
    let builder = new System.Text.StringBuilder()
    if hasProp "id" then
        builder.AppendFormat("{0}: ", valueOf "id") |> ignore
    if hasProp "progress" then
        builder.AppendFormat("{0} {1}{2}", valueOf "status", valueOf "progress", newLine) |> ignore
    elif hasProp "stream" then
        builder.AppendFormat("{0}", valueOf "stream") |> ignore
    elif hasProp "status" then
        builder.AppendFormat("{0}{1}", valueOf "status", newLine) |> ignore
    else
        builder.Append(line) |> ignore

    builder.ToString()

let outputBuildResponse (responseStream : Stream) : unit =
    seq {
        use reader = new StreamReader(responseStream, Text.Encoding.UTF8)
        while not reader.EndOfStream do
            yield reader.ReadLine()
    }
    |> Seq.map formatResponse
    |> Seq.iter (printf "%s")

前回の記事の出力がこれで、

{"stream":"Step 1/2 : FROM busybox\n"}
{"status":"Pulling from library/busybox","id":"latest"}
{"status":"Pulling fs layer","progressDetail":{},"id":"1cae461a1479"}
{"status":"Downloading","progressDetail":{"current":16384,"total":699311},"progress":"[=\u003e                                                 ] 16.38 kB/699.3 kB","id":"1cae461a1479"}
{"status":"Downloading","progressDetail":{"current":260087,"total":699311},"progress":"[==================\u003e                                ] 260.1 kB/699.3 kB","id":"1cae461a1479"}
{"status":"Downloading","progressDetail":{"current":424839,"total":699311},"progress":"[==============================\u003e                    ] 424.8 kB/699.3 kB","id":"1cae461a1479"}
{"status":"Downloading","progressDetail":{"current":490375,"total":699311},"progress":"[===================================\u003e               ] 490.4 kB/699.3 kB","id":"1cae461a1479"}
{"status":"Downloading","progressDetail":{"current":539527,"total":699311},"progress":"[======================================\u003e            ] 539.5 kB/699.3 kB","id":"1cae461a1479"}
{"status":"Downloading","progressDetail":{"current":621447,"total":699311},"progress":"[============================================\u003e      ] 621.4 kB/699.3 kB","id":"1cae461a1479"}
{"status":"Downloading","progressDetail":{"current":699311,"total":699311},"progress":"[==================================================\u003e] 699.3 kB/699.3 kB","id":"1cae461a1479"}
{"status":"Verifying Checksum","progressDetail":{},"id":"1cae461a1479"}
{"status":"Download complete","progressDetail":{},"id":"1cae461a1479"}
{"status":"Extracting","progressDetail":{"current":32768,"total":699311},"progress":"[==\u003e                                                ] 32.77 kB/699.3 kB","id":"1cae461a1479"}
{"status":"Extracting","progressDetail":{"current":699311,"total":699311},"progress":"[==================================================\u003e] 699.3 kB/699.3 kB","id":"1cae461a1479"}
{"status":"Extracting","progressDetail":{"current":699311,"total":699311},"progress":"[==================================================\u003e] 699.3 kB/699.3 kB","id":"1cae461a1479"}
{"status":"Pull complete","progressDetail":{},"id":"1cae461a1479"}
{"status":"Digest: sha256:c79345819a6882c31b41bc771d9a94fc52872fa651b36771fbe0c8461d7ee558"}
{"status":"Status: Downloaded newer image for busybox:latest"}
{"stream":" ---\u003e c75bebcdd211\n"}
{"stream":"Step 2/2 : RUN ls\n"}
{"stream":" ---\u003e Running in 74350655bd58\n"}
{"stream":"bin\ndev\netc\nhome\nproc\nroot\nsys\ntmp\nusr\nvar\n"}
{"stream":" ---\u003e 7fc898365619\n"}
{"stream":"Removing intermediate container 74350655bd58\n"}
{"stream":"Successfully built 7fc898365619\n"}

formatResponse関数を使ってパースして出力するとこうなります。

Step 1/2 : FROM busybox
latest: Pulling from library/busybox
1cae461a1479: Pulling fs layer
1cae461a1479: Downloading [=>                                                 ] 15.93 kB/699.3 kB
1cae461a1479: Downloading [===============>                                   ] 211.8 kB/699.3 kB
1cae461a1479: Downloading [=======================>                           ] 326.5 kB/699.3 kB
1cae461a1479: Downloading [=========================>                         ] 359.3 kB/699.3 kB
1cae461a1479: Downloading [============================>                      ] 392.1 kB/699.3 kB
1cae461a1479: Downloading [==============================>                    ] 424.8 kB/699.3 kB
1cae461a1479: Downloading [=================================>                 ]   474 kB/699.3 kB
1cae461a1479: Downloading [=====================================>             ] 523.1 kB/699.3 kB
1cae461a1479: Downloading [========================================>          ] 572.3 kB/699.3 kB
1cae461a1479: Downloading [============================================>      ] 621.4 kB/699.3 kB
1cae461a1479: Downloading [==============================================>    ] 654.2 kB/699.3 kB
1cae461a1479: Downloading [=================================================> ]   687 kB/699.3 kB
1cae461a1479: Downloading [==================================================>] 699.3 kB/699.3 kB
1cae461a1479: Verifying Checksum
1cae461a1479: Download complete
1cae461a1479: Extracting [==>                                                ] 32.77 kB/699.3 kB
1cae461a1479: Extracting [=======================================>           ] 557.1 kB/699.3 kB
1cae461a1479: Extracting [==================================================>] 699.3 kB/699.3 kB
1cae461a1479: Extracting [==================================================>] 699.3 kB/699.3 kB
1cae461a1479: Pull complete
Digest: sha256:c79345819a6882c31b41bc771d9a94fc52872fa651b36771fbe0c8461d7ee558
Status: Downloaded newer image for busybox:latest
 ---> c75bebcdd211
Step 2/2 : RUN ls
 ---> Running in 5c8584208f21
bin
dev
etc
home
proc
root
sys
tmp
usr
var
 ---> b95a8e54a8f1
Removing intermediate container 5c8584208f21
Successfully built b95a8e54a8f1