Запуск Docker из Visual Studio 2019 на Windows вызывает исключение UnauthorizedAccessException для /app/appsettings.json, когда файлы доступны только для чтения из-за TFS - PullRequest
0 голосов
/ 19 марта 2020

Я строю asp. net проект в docker в windows 10 - Linux Контейнер, и у меня возникла странная проблема. В TFS (MS Legacy Source Control ;-)) все файлы доступны только для чтения, если вы не проверите их. Казалось бы, все работает, но я думаю, что последние обновления (не знаю, из docker или visual studio), похоже, вызывают проблемы с правами на файл.

Что происходит: 1 - если я проверяю все и запустить приложение asp. net все в порядке. (Все файлы доступны для записи в windows)

2 - если все проверено и, следовательно, доступно только для чтения, я получаю:

{System.UnauthorizedAccessException: Access to the path '/app/appsettings.json' is denied.
 ---> System.IO.IOException: Operation not permitted
   --- End of inner exception stack trace ---
   at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)
   at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)
   at System.IO.FileStream.OpenHandle(FileMode mode, FileShare share, FileOptions options)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   at Microsoft.Extensions.FileProviders.Physical.PhysicalFileInfo.CreateReadStream()
   at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload)
   at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load()
   at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
   at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
   at Microsoft.Extensions.Hosting.HostBuilder.BuildAppConfiguration()
   at Microsoft.Extensions.Hosting.HostBuilder.Build()
   at MyShared.Modules.Sample.AspCoreSample.Program.Main(String[] args) in W:\MyShared\Modules.Sample\Trunk\src\Cpoe.AspCoreSample\Program.cs:line 13}

Проверка с помощью docker.

Когда это не работает 555:
root@26d788df21ac:/app# ls -l
-r-xr-xr-x 1 root root  192 Mar 19 07:49 appsettings.json
  1. Когда это работает 755:
-rwxr-xr-x 1 root root  192 Mar 19 07:49 appsettings.json

Ну, я пытался запустить chmod в докер-файле безуспешно. Также запуск chown вообще не помог. (см. «код» в конце)

Затем я решил сначала скопировать мои источники в отдельную папку, прежде чем генерировать образ docker. Итак, я добавил задачу перед сборкой:

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="(robocopy $(SolutionDir)Cpoe.AspCoreSample $(SolutionDir)DockerTemp\Cpoe.AspCoreSample /Z /S /A-:R /copy:DT /NFL /NDL /NJH /NJS /nc /ns /np) ^&amp; IF %2525ERRORLEVEL%2525 LSS 8 SET ERRORLEVEL = 0" />
    <Exec Command="attrib -r $(SolutionDir)DockerTemp\Cpoe.AspCoreSample\*.* /s" />
  </Target>

ПРИМЕЧАНИЕ: (robocopy почему-то все еще копирует атрибут readonly - но это другой вопрос, поэтому я запускаю attrib)

Все хорошо. Атрибуты только для чтения исчезли.

Затем я попытался создать изображение docker, используя это:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["DockerTemp/Cpoe.AspCoreSample/MyShared.Shared.Modules.Cpoe.AspCoreSample.csproj", "Cpoe.AspCoreSample/"]
COPY ["DockerTemp/Cpoe.Contracts/MyShared.Shared.Modules.Cpoe.Contracts.csproj", "Cpoe.Contracts/"]
RUN dotnet restore "Cpoe.AspCoreSample/MyShared.Shared.Modules.Cpoe.AspCoreSample.csproj" && \
    dotnet restore "Cpoe.Contracts/MyShared.Shared.Modules.Cpoe.Contracts.csproj"
COPY DockerTemp .
WORKDIR "/src/Cpoe.AspCoreSample"
RUN dotnet build "MyShared.Shared.Modules.Cpoe.AspCoreSample.csproj" -c Debug -o /app/build

FROM build AS publish
RUN dotnet publish "MyShared.Shared.Modules.Cpoe.AspCoreSample.csproj" -c Debug -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyShared.Shared.Modules.Cpoe.AspCoreSample.dll"]

И все же нет 755 в файлах! Я думал, ЧТО !? У меня нет другой идеи.

Обновления, которые могли вызвать это:

  • Visual Studio 16.4.6 (я всегда использую последнюю версию)
  • Docker Двигатель v19.03.8

Я работаю Windows 10 PRO 64 B.18362 WSL 1 !! Я надеюсь, что такого рода проблемы будут исправлены на WSL2, но я не могу пока получить Windows Превью в моей компании.

Есть ли что-то, чего мне здесь не хватает?

Только для завершенность, вот как я пытался решить проблему с помощью файла docker, но безуспешно:

FROM base AS final
WORKDIR /app
COPY --chown=www-data:www-data --from=publish /app/publish .
RUN chmod -R 777 /app/data
USER www-data (also tried with 33)
ENTRYPOINT ["dotnet", "MyShared.Shared.Modules.Cpoe.AspCoreSample.dll"]

Что работает, подключается к изображению, изменяет разрешения и снова запускается , Понятия не имею, зачем ему нужны права на запись в эти файлы.

Вы видите, что это действительно связано с флагами только для чтения в Windows, этот файл имеет 755:

-rwxr -xr-x 1 root root 391 10 февраля 18:13 MyShared.Shared.Modules.Cpoe.AspCoreSample.csproj.user

Приветствия, Марко

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...