2025/02/21

[ASP.NET Core] 解決如何從 Docker Container 連至本機的 SQL Server

問題

在 Visual Studio 開發 ASP.NET Core 網站以 IIS Express 啟動時可正確連線 SQL Server 的資料庫。

近期改以 Docker 來啟動網站時,出現以下錯誤訊息:

SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 40 - Could not open a connection to SQL Server)

2025/01/30

[AI] 如何在本地機器使用 DeepSeek-R1 模型

前言

AI 話題這幾年一直話題不斷,而前一陣子 DeepSeek 的聲量突然上升了不少,好像不研究一下不行。

今天就花了些時間,研究如何在本地執行 DeepSeek-R1 模型。

安裝步驟

  1. 安裝 Ollama
  2. 使用 DeepSeek-R1 模型
  3. 執行 Open-WebUI

2025/01/26

[ASP.NET Core] 如何在 ASP.NET Core 專案中的 Dockerfile 設定預設時區

問題

在開發 ASP.NET Core 專案時,Docker Image 預設的時區是 UTC,可以把時區預設定在 Asia/Taipei 嗎?

環境

  • Windows 11
  • Visual Studio 2022 (v17.12.4)
  • ASP.NET Core (.NET 8)

解決方法

在 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 的環境變數值

2025/01/24

[Azure] ASP.NET Core 專案部署到 Web App for Containers 問題除錯心得

前言

因為新專案要求要用 Docker,本地開發端的問題通常不大,開專案也都有 Template,往往都是實際要部署上線時會遇到一些狀況。

趁著記憶猶新,整理一下部署心得

開發環境

  • Windows 11
  • Docker Desktop v4.37.1
  • Visual Studio 2022 (v17.11.x -- 原版本忘了,因部署 Bug 問題,後來升級到 v17.12.4)
  • ASP.NET Core Web App (Model-View-Controller) 專案
  • .NET 8.0

選擇部署到 Azure 的服務

將專案部署到 Azure 上,我選擇的服務如下:

  • Azure Container Registry (ACR)
  • Azure App Service (Web App for Containers)
  • Azure SQL Database
  • Azure Storage

2025/01/23

[ASP.NET Core] 解決 ASP.NET Core 在 Linux Container 出現無法載入 libSkiaSharp 相依性問題

前言

一直以來開發的 ASP.NET Core 專案都是在 Windows 環境執行。最近才開始接觸開發 ASP.NET Core 專案執行於 Docker Container 的開發環境,馬上就遇到處理圖片的問題。

在 Windows 的環境下處理圖片會用到 System.Drawing.Common,但在 Linux 環境下是不支援的。所以在 Linux 下的圖片處理改採用 SkiaSharp 的套件。

SkiaSharp 這個套件在 Windows 及 Linux 都可以用,在 Windows 的開發環境已有測試套過可以正常運作,沒想到在 Linux 環境下還是噴錯了。

環境

  • Docker Container (預設 ASP.NET Core 專案用的 base 我改用 aspnet:8.0-jammy-chiseled 可減少 image size)
  • .NET 8.0
  • NuGet 安裝套件: SkiaSharp 版本 3.116.1

問題

而在使用 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 套件

特此記錄一下,供未來翻查用

2025/01/10

[Docker] 解決 permission denied 的問題

問題

在 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

指令步驟:

  1. 建立 docker 群組 (若不存在的話)
  2. 加入自己的帳號至 docker 群組
  3. 以群組 docker 的身份登入 (無需登出再登入)
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

2024/10/24

[ASP.NET MVC] 解決在 WebAPI 讀取不到 Session 值的問題

環境

  • ASP.NET MVC 5
  • .NET Framework 4.7.2+

問題

原本有個設定值以 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);
}

參考資料