【问题标题】:Getting 'System.TypeInitializationException' when running project in Docker在 Docker 中运行项目时获取“System.TypeInitializationException”
【发布时间】:2019-02-14 04:49:42
【问题描述】:

我有一个任务,我必须将我的 CSOM .NET CORE 2.2 项目放在 docker 中。

该项目包含一个控制台应用程序,该应用程序调用更新分类字段的 CSOM 项目 (dll)。

当我自己运行项目时,它运行良好。

当我将项目放入 Docker 容器中并尝试运行它时,我得到以下信息

System.AggregateException:发生一个或多个错误。 ('Microsoft.Win32.Registry' 的类型初始化器抛出异常。)---> System.TypeInitializationException:'Microsoft.Win32.Registry' 的类型初始化器抛出异常。 ---> System.PlatformNotSupportedException: 此平台不支持注册表。

这是我的 Docker 文件

FROM microsoft/aspnetcore-build:2.0
FROM microsoft/dotnet:2.2-aspnetcore-runtime
FROM microsoft/dotnet:2.2-sdk

WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy and build everything else
COPY . ./
#RUN dotnet publish -c Release -o out
ENTRYPOINT ["dotnet", "out/WebJobCore.dll"]

这是控制台应用程序中的部分代码

    public static void Main(string[] args)
    {

        Console.WriteLine("Testing webjob");

        Program t = new Program();
        t.RunSynchronizer().Wait();
    }

    public async Task RunSynchronizer()
    {
        var traceWriter = new ConsoleTraceWriter();
        var taxonomyFactory = new ItaTaxonomyFactory();
        var synchronizer = new ItaTaxonomySynchronizer(traceWriter, taxonomyFactory);

        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();

        await synchronizer.SyncAll();

        stopWatch.Stop();

        TimeSpan ts = stopWatch.Elapsed;
        // Format and display the TimeSpan value.
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine("My RunTime " + elapsedTime);
    }

这是来自外部同步器 dll 的代码

    public async Task SyncAll()
    {
        using (ClientContext context = new ClientContext(ConfigSettings.SiteUrl))
        {

            context.Credentials = new SharePointOnlineCredentials(
                "username",
                "password");
            var taxonomyService = TaxonomySession.GetTaxonomySession(context);
            var termStore = taxonomyService.GetDefaultSiteCollectionTermStore();
            context.Load(taxonomyService);
            context.Load(termStore);
            await context.ExecuteQueryAsync();
            }
         }

这是我的 docker build 命令

docker build -t mylatestimage .

这是我的 docker run 命令

docker run mylatestimage

当我在 Visual Studio 中运行控制台应用程序或项目本身的可执行文件时,一切运行正常。当我尝试运行 docker 时,我只得到“测试 webjob”输出并且程序在 await synchronizer.SyncAll() 行产生上述错误

请告诉我如何解决它

非常感谢您的帮助

【问题讨论】:

  • “此平台不支持注册表” - 听起来不太乐观。
  • 这是否意味着 docker 根本无法工作,还是我应该将外部 dll 中的代码放入单个项目中?
  • 这意味着你应该弄清楚你的代码的哪一部分试图使用 Windows 注册表,看看你是否可以删除它。请注意,如果这与 Docker 本身有关,我会感到惊讶——我怀疑在不涉及任何容器的情况下在 Linux 上运行也会得到相同的结果。
  • 但是我的项目明确没有使用任何注册表
  • 这是否意味着在 CSOM 内部某处需要注册机构?这是否意味着 CSOM 根本无法在 Linux 上运行?

标签: c# docker .net-core csom


【解决方案1】:

在我切换到 Docker 上的 Windows 容器并使用此命令拉下 Nano Server 后,这是可能的

docker pull mcr.microsoft.com/windows/nanoserver

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多