Buy Me a Coffee

解決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

解決方案

  1. 程式內設置時區(不推薦):

    在程式中硬程式時區設置。這是一種快速解決問題的方法,但缺乏靈活性。

    var connection = new OracleConnection();
    connection.ConnectionString = ...;
    connection.Open();
    OracleGlobalization info = connection.GetSessionInfo();
    info.TimeZone = "Asia/Taipei";
    connection.SetSessionInfo(info);
    
  2. 在Dockerfile中設置環境變數

    在Dockerfile中設置環境變數來指定時區。

    # 加在 ENTRYPOINT 前
    ENV TZ=Asia/Taipei
    ENTRYPOINT ["xxx", "xxx"]
    
  3. 使用docker run時添加環境變數

    在使用 docker run 啟動容器時,添加 -e 參數來設置時區。

    docker run -e TZ=Asia/Taipei -d -p 8080:80 --name myapp myimage
    

參考資料

通過以上方法,可以有效解決在Docker容器中運行的.NET Core應用程式在連接Oracle資料庫時遇到的時區問題。