問題
在 Visual Studio 開發 ASP.NET Core 網站以 IIS Express 啟動時可正確連線 SQL Server 的資料庫。
近期改以 Docker 來啟動網站時,出現以下錯誤訊息:
技術誌記錄學習或專案執行當下遇到的問題及解決方案,方便日後翻查,益人益己!
在 Visual Studio 開發 ASP.NET Core 網站以 IIS Express 啟動時可正確連線 SQL Server 的資料庫。
近期改以 Docker 來啟動網站時,出現以下錯誤訊息:
AI 話題這幾年一直話題不斷,而前一陣子 DeepSeek 的聲量突然上升了不少,好像不研究一下不行。
今天就花了些時間,研究如何在本地執行 DeepSeek-R1 模型。
在開發 ASP.NET Core 專案時,Docker Image 預設的時區是 UTC,可以把時區預設定在 Asia/Taipei 嗎?
在 Dockerfile 的 base 上加一段 ENV TZ=Asia/Taipei
(有試過加在 final 上,但是在 Visual Studio 開發時並不會正確載入,發佈到 Azure Web App for Containers 確認是有正確載入時區的)
而且 Image 要選 dotnet/aspnet:8.0
不要選 dotnet/aspnet:8.0-jammy-chiseled
(不能因為佔空間才選它,它是不包含 tzdata 套件的)
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER app
WORKDIR /app
ENV TZ=Asia/Taipei # 加 TZ 這一個變數
EXPOSE 8080
EXPOSE 8081
...
若是不想要變更 Dockerfile 的設定,在 Visual Studio 開發,可以修改 launchSettings.json
檔案
在 Dockerfile 的 environmentVariables 加上 TZ
的參數
執行 docker run 的命令會帶入 TZ 的環境變數值
因為新專案要求要用 Docker,本地開發端的問題通常不大,開專案也都有 Template,往往都是實際要部署上線時會遇到一些狀況。
趁著記憶猶新,整理一下部署心得
將專案部署到 Azure 上,我選擇的服務如下:
一直以來開發的 ASP.NET Core 專案都是在 Windows 環境執行。最近才開始接觸開發 ASP.NET Core 專案執行於 Docker Container 的開發環境,馬上就遇到處理圖片的問題。
在 Windows 的環境下處理圖片會用到 System.Drawing.Common
,但在 Linux 環境下是不支援的。所以在 Linux 下的圖片處理改採用 SkiaSharp
的套件。
SkiaSharp 這個套件在 Windows 及 Linux 都可以用,在 Windows 的開發環境已有測試套過可以正常運作,沒想到在 Linux 環境下還是噴錯了。
aspnet:8.0-jammy-chiseled
可減少 image size)而在使用 SkiaSharp 處理圖片的過程中出現以下錯誤訊息:
An unhandled exception occurred while processing the request.
DllNotFoundException: Unable to load shared library 'libSkiaSharp' or one of its dependencies.
需要再安裝 SkiaSharp.NativeAssets.Linux.NoDependencies
套件
特此記錄一下,供未來翻查用
在 Ubuntu VM 安裝 Docker 後執行 docker info
遇到 permission denied 的問題
錯誤訊息:
ERROR: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.47/info": dial unix /var/run/docker.sock: connect: permission denied
errors pretty printing info
參考連結: https://stackoverflow.com/questions/48957195/how-to-fix-docker-got-permission-denied-issue
指令步驟:
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
原本有個設定值以 Cookie 為存取來源, 但因應安全理由改寫成 Session 來存取, 卻在 WebAPI 存取時發生讀取不到 Session 的內容。
在 ASP.NET Core MVC 反而簡單, 只要 services.AddSession()
跟 app.UseSession()
即搞定。
目前還是有許多不是 .NET Core 的專案,記錄一下以供未來翻查用。
修改 Global.asax.cs
檔案
protected void Application_PostAuthorizeRequest()
{
// WebApi SessionState
bool isWebApiRequest = HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith("~/api");
if (isWebApiRequest) HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}