Использование Stimulsoft в контейнере Docker (net core)

Обсуждение Stimulsoft Ultimate
Ответить
George Khuriev
Сообщения: 6
Зарегистрирован: 19 окт 2018, 09:50

Использование Stimulsoft в контейнере Docker (net core)

Сообщение George Khuriev » 15 янв 2019, 09:55

Добрый день!
При использовании отчетов из Linux контейнера Docker в дизайнере отчета появляется ошибка:

An unhandled exception occurred while processing the request.
DllNotFoundException: Unable to load shared library 'libdl' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibdl: cannot open shared object file: No such file or directory
Interop+Libdl.dlopen(string fileName, int flag)

TypeInitializationException: The type initializer for 'Gdip' threw an exception.
System.Drawing.SafeNativeMethods+Gdip.GdipNewPrivateFontCollection(out IntPtr fontCollection)

TypeInitializationException: The type initializer for 'Stimulsoft.Base.StiFontCollection' threw an exception.
Stimulsoft.Base.StiFontCollection.GetFontFamilies() in D:\Stimulsoft\Stimulsoft.Reports\.NetCore\Stimulsoft.Base\StiFontCollection.cs, line 83

DllNotFoundException: Unable to load shared library 'libdl' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibdl: cannot open shared object file: No such file or directory
Interop+Libdl.dlopen(string fileName, int flag)
System.Drawing.SafeNativeMethods+Gdip.LoadNativeLibrary()
System.Drawing.SafeNativeMethods+Gdip..cctor()

Show raw exception details
TypeInitializationException: The type initializer for 'Gdip' threw an exception.
System.Drawing.SafeNativeMethods+Gdip.GdipNewPrivateFontCollection(out IntPtr fontCollection)
System.Drawing.Text.PrivateFontCollection..ctor()
Stimulsoft.Base.StiFontCollection..cctor() in D:\Stimulsoft\Stimulsoft.Reports\.NetCore\Stimulsoft.Base\StiFontCollection.cs

Show raw exception details
TypeInitializationException: The type initializer for 'Stimulsoft.Base.StiFontCollection' threw an exception.
Stimulsoft.Base.StiFontCollection.GetFontFamilies() in D:\Stimulsoft\Stimulsoft.Reports\.NetCore\Stimulsoft.Base\StiFontCollection.cs
Stimulsoft.Report.Web.StiFontNames.GetItems() in D:\Stimulsoft\Stimulsoft.Reports\.NetCore\Stimulsoft.Report.WebDesign\Helpers\StiFontNames.cs
Stimulsoft.Report.Mvc.StiNetCoreDesigner.RenderJsonParameters() in D:\Stimulsoft\Stimulsoft.Reports\.NetCore\Stimulsoft.Report.Mvc.NetCore\Designer\StiNetCoreDesigner.Render.cs
Stimulsoft.Report.Mvc.StiNetCoreDesigner.CreateChildControls() in D:\Stimulsoft\Stimulsoft.Reports\.NetCore\Stimulsoft.Report.Mvc.NetCore\Designer\StiNetCoreDesigner.Render.cs
Stimulsoft.Report.Mvc.StiNetCoreHelper.StiNetCoreDesigner(IHtmlHelper htmlHelper, string ID, StiNetCoreDesignerOptions options) in D:\Stimulsoft\Stimulsoft.Reports\.NetCore\Stimulsoft.Report.Mvc.NetCore\StiNetCoreHelper.cs
AspNetCore.Views_Design_Reports.ExecuteAsync() in C:\QSPro1\src\QuestionnaireStudioPro\Views\Design\Reports.cshtml
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context)
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, bool invokeViewStarts)
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context)
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, string contentType, Nullable<int> statusCode)
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ActionContext actionContext, IView view, ViewDataDictionary viewData, ITempDataDictionary tempData, string contentType, Nullable<int> statusCode)
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ExecuteAsync(ActionContext context, ViewResult result)
Microsoft.AspNetCore.Mvc.ViewResult.ExecuteResultAsync(ActionContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultAsync(IActionResult result)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResultFilterAsync<TFilter, TFilterAsync>()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.ResultNext<TFilter, TFilterAsync>(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultFilters()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)


Dockerfile:

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY ["src/QuestionnaireStudioPro/QuestionnaireStudioPro.csproj", "src/QuestionnaireStudioPro/"]
RUN dotnet restore "src/QuestionnaireStudioPro/QuestionnaireStudioPro.csproj"
COPY . .
WORKDIR "/src/src/QuestionnaireStudioPro"

RUN dotnet build "QuestionnaireStudioPro.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "QuestionnaireStudioPro.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
# install System.Drawing native dependencies
RUN apt-get update \
&& apt-get install -f -y --allow-unauthenticated \
libc6 \
libcurl3 \
libgcc1 \
libgssapi-krb5-2 \
libicu52 \
liblttng-ust0 \
libssl1.0.0 \
libstdc++6 \
libunwind8 \
libuuid1 \
libgdiplus \
zlib1g \
&& rm -rf /var/lib/apt/lists/*

ENTRYPOINT ["dotnet", "QuestionnaireStudioPro.dll"]

Что делать ?
George Khuriev
Сообщения: 6
Зарегистрирован: 19 окт 2018, 09:50

Re: Использование Stimulsoft в контейнере Docker (net core)

Сообщение George Khuriev » 15 янв 2019, 11:41

Проблему решили переписав dockerfile следующим образом:

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
RUN apt-get update \
&& apt-get install -y --no-install-recommends libgdiplus libc6-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists /var/cache/apt/archives
WORKDIR /app
EXPOSE 80

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY ["src/QuestionnaireStudioPro/QuestionnaireStudioPro.csproj", "src/QuestionnaireStudioPro/"]
RUN dotnet restore "src/QuestionnaireStudioPro/QuestionnaireStudioPro.csproj"
COPY . .
WORKDIR "/src/src/QuestionnaireStudioPro"

RUN dotnet build "QuestionnaireStudioPro.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "QuestionnaireStudioPro.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "QuestionnaireStudioPro.dll"]
Andrew
Сообщения: 550
Зарегистрирован: 09 июн 2006, 08:22

Re: Использование Stimulsoft в контейнере Docker (net core)

Сообщение Andrew » 16 янв 2019, 04:08

Здравствуйте,

Спасибо ответ и за вариант решения проблемы.

Спасибо.
George Khuriev
Сообщения: 6
Зарегистрирован: 19 окт 2018, 09:50

Re: Использование Stimulsoft в контейнере Docker (net core)

Сообщение George Khuriev » 17 янв 2019, 08:36

Ошибки с контейнерами не закончились...
Сейчас нет ошибок с графической частью, но отчёт не получает данные.

При создании отчёта мы указываем путь к методу для получения данных следующим образом:
"0":{
"Ident":"StiJsonDatabase",
"Name":"Basic",
"Alias":"Базовые данные",
"PathData":"http://localhost:32768/AnaliticsPro/Get ... esecretkey"
}
Но в отчёт данные не поступают. При предварительном просмотре отчёта получаем сообщение:
1.Сообщения построения отчета
Соединение 'Basic': Cannot assign requested address Cannot assign requested address

Если скопировать путь http://localhost:32768/AnaliticsPro/Get ... esecretkey и вставить его в браузер данные приходят.
Но если мы пытаемся получить данные в дизайнере отчёта, то идет бесконечная загрузка.
Если же мы меняем
http://localhost:32768/AnaliticsPro/Get ... esecretkey
на
http://localhost:80/AnaliticsPro/GetDat ... esecretkey,
то данные доходят до отчёта.
При запуске не из контейнера все работает в штатном режиме.
С чем может быть связана данная проблема?
Aleksey
Сообщения: 2027
Зарегистрирован: 22 апр 2010, 02:57

Re: Использование Stimulsoft в контейнере Docker (net core)

Сообщение Aleksey » 21 янв 2019, 07:44

Здравствуйте,

Данные для отчета загружаются в самом генераторе отчета на стороне сервера, возможно на вашем сервере (или в контейнере Docker) нет доступа по указанному URL. Пожалуйста проверьте, есть ли доступ к файлу по указанному URL. Ещё как вариант, данные можно загрузить отдельно в файл, и затем зарегистрировать в отчете при помощи метода report.RegData(...)

Спасибо.
Ответить