Windows Container中修改json檔案設定值的方法

通常使用到Docker技術執行Container容器都是使用Linux環境,但是Windows環境也可以使用Container,有的時候因為一些考量會需要製作兩套不同環境(Windows & Linux)的Docker Image,所以前面一篇文章提到了如何在Linux Container中修改json檔案設定值的方法,這一篇則是來說明如何在Windows Container中做到一樣的事情。

不同的地方在於,Linux環境中透過額外安裝jq套件來達成修改json檔案的作法,在Windows環境下我們則是使用PowerShell來達成這樣的事情,所以不需要額外安裝任何套件(PowerShell應該都有內建在Windows環境中)。

下面的內容和Linux Container中修改json檔案設定值的方法文章中的內容幾乎一樣,我額外用不同的字型顏色標出不同的地方,以便參考。

使用方式

假設在Dockerfile中定義了ENV LOG_LEVEL=Error,並且appsettings.json檔案中有段Serilog的設定如下:

{
    "Serilog": {
        "MinimumLevel": "Debug",
        "WriteTo": [
            {
                "Name": "File",
                "Args": {
                    "path": "MyApp.log",
                    "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} RequestID:{RequestID} User:{UserID} {RequestPath} {SourceContext} [{Level:u3}] {Message:lj}{NewLine}{Exception}",
                    "rollingInterval": "Day"
                }
            }
        ],
        "Enrich": [ "FromLogContext" ]
    }
}

可以看到在Serilog中有個MinimumLevel屬性設定的是Debug,這個設定會記錄大量的Log記錄,但是有時候在執行container的時候並不想要記錄這麼詳細的資訊,以降低檔案大小,減少儲存空間的耗用時,有個LOG_LEVEL的ENV設定就可以方便的調整設定值。

現在假設有個.Net Core的程式叫MyApp,Build完之後有個MyApp.dll檔案,在Dockerfile中設定了ENV和複製相關的執行檔案之外,還需要一個.ps1檔案(Powershell的副檔名),假設這個檔案叫做app-init.ps1

接下來在app-init.ps1檔案中要做下面這幾件事:

  1. 判斷container是不是第一次執行,以避免每次都進行修改appsettings.json的動作。
  2. 透過Powershell的Get-Content指令將appsettings.json的內容讀入記憶體。
  3. 找到MinimumLevel屬性,將值修改為LOG_LEVEL這個ENV所設定的值。
  4. Powershell修改後的內容儲存為appsettings.temp.json。
  5. 將原本的appsettings.json改名為appsettings.ori.json。
  6. 將前面的appsettings.temp.json改名為appsettings.json。
  7. 產生一個用來判斷是否執行過app-init.ps1的檔案,例如:inited.txt
  8. 啟動MyApp。
Set-Location C:\app

if (Test-Path inited.txt) {
    echo "Powershell already run finished."
}
else {
    $JsonSettings = Get-Content appsettings.json | ConvertFrom-Json
    $JsonSettings.Serilog.MinimumLevel = "$env:LOG_LEVEL"
    $JsonSettings | ConvertTo-Json -Depth 10 > appsettings.temp.json

    Rename-Item appsettings.json appsettings.ori.json
    Rename-Item appsettings.temp.json appsettings.json
    "Powershell run finished." > inited.txt
}

dotnet MyApp.dll

發佈留言

%d 位部落客按了讚: