解決Container中的Oracle Timezone問題
在Docker容器中運行的.NET Core應用程式連接Oracle資料庫時,可能會遇到ORA-00604和ORA-01882錯誤,這與時區設置有關。以下是一些解決方法:
錯誤訊息
當從容器內透過 Oracle.ManagedDataAccess.Core 連接到資料庫時,出現以下錯誤:
Oracle.ManagedDataAccess.Client.OracleException
HResult=0x80004005
Message=ORA-00604: error occurred at recursive SQL level 1
ORA-01882: timezone region not found
解決方案
程式內設置時區(不推薦):
在程式中硬程式時區設置。這是一種快速解決問題的方法,但缺乏靈活性。
var connection = new OracleConnection(); connection.ConnectionString = ...; connection.Open(); OracleGlobalization info = connection.GetSessionInfo(); info.TimeZone = "Asia/Taipei"; connection.SetSessionInfo(info);
在Dockerfile中設置環境變數:
在Dockerfile中設置環境變數來指定時區。
# 加在 ENTRYPOINT 前 ENV TZ=Asia/Taipei ENTRYPOINT ["xxx", "xxx"]
使用docker run時添加環境變數:
在使用
docker run
啟動容器時,添加-e
參數來設置時區。docker run -e TZ=Asia/Taipei -d -p 8080:80 --name myapp myimage
參考資料
通過以上方法,可以有效解決在Docker容器中運行的.NET Core應用程式在連接Oracle資料庫時遇到的時區問題。