Iot Edge: создание образа Docker из нескольких проектов

#docker #azure-iot-edge

#docker #azure-iot-edge

Вопрос:

Я могу успешно создать и запустить в Visual Studio, но я получил сообщение об ошибке при попытке создать образ docker (TestModule) из Visual Studio, который ссылается на 2 проекта (Microsoft.Azure.Устройства.Edge.Util ModuleLib). Есть идеи, что не так с моим файлом dockerfile? Для сборки я щелкаю правой кнопкой мыши по project> build amp; push модулям IoT edge (я использую инструмент расширения vs).

Проекты:

  -TestModule
       |--Dockerfile
 -Microsoft.Azure.Devices.Edge.Util
 -ModuleLib
  

TestModule.csproj

 ...
    <ItemGroup>
        <ProjectReference Include="..Microsoft.Azure.Devices.Edge.UtilMicrosoft.Azure.Devices.Edge.Util.csproj" />
        <ProjectReference Include="..ModuleLibMicrosoft.Azure.Devices.Edge.ModuleUtil.csproj" />
      </ItemGroup>
...
  

Ошибки сборки:

 Step 4/12 : COPY Microsoft.Azure.Devices.Edge.Util/*.csproj ./Microsoft.Azure.Devices.Edge.Util/
COPY failed: no source files were specified
[ERROR]: COPY failed: no source files were specified
  

Обновить:
*
если вы попытаетесь создать это внутри DOCKERFILE, используя VS Code, файл не сможет получить доступ, поскольку контекст docker настроен на доступ к папке модуля. Следовательно, правильная команда должна быть для настройки контекста в корневой папке.

Запуск в Powershell в корневой папке (заменен myacr.azurecr.io с вашим контейнером):

 docker build --rm -f .TestModuleDockerfile.windows-amd64 -t myacr.azurecr.io/testmodule:0.0.7-windows-amd64 .;if ($?) { docker push myacr.azurecr.io/testmodule:0.0.7-windows-amd64 }
  

Dockerfile в TestModule (Dockerfile.windows-amd64):

   FROM microsoft/dotnet:2.1-sdk AS build-env
WORKDIR /app

COPY . .
RUN dotnet restore ./TestModule/TestModule.csproj

COPY . ./
RUN dotnet publish ./TestModule/TestModule.csproj -c Release -o out

FROM microsoft/dotnet:2.1-runtime-nanoserver-1809
WORKDIR /app
COPY --from=build-env /app/TestModule/out ./
ENTRYPOINT ["dotnet", "TestModule.dll"]
  

Я создал DockerBuild.пакетный скрипт bat в корневой папке проекта (заменен myacr.azurecr.io для вашего контейнера) просто введите в качестве параметра имя модуля (в нижнем регистре) версию:

  @echo off
  Rem Run docker build image and push to Azure Container


  IF "%~1"==""  (
      ECHO Missing module name parameter lowercase. Ex: DockerBuild.bat modulename
      EXIT
  )

  IF "%~2"==""  (
      ECHO Missing version parameter. Ex: DockerBuild.bat modulename version
      EXIT
  )

  set modulename=%~1
  set version=%~2

  echo Module name: %modulename%
  echo Version: %version%

  docker build --rm -f .%modulename%Dockerfile.windows-amd64 -t myacr.azurecr.io/%modulename%:%version%-windows-amd64 .
  docker push myacr.azurecr.io/%modulename%:%version%-windows-amd64

  echo The Docker build has completed
  

Комментарии:

1. Я думаю, что нашел кое-что, связанное с моей проблемой: github.com/Azure/iotedge/issues/67

2. если вы попытаетесь создать это внутри DOCKERFILE, используя VS Code, файл не сможет получить доступ, поскольку контекст docker настроен на доступ к папке модуля. Поэтому необходимо создать корневую папку, содержащую все папки, на которые ссылаются!

3. Используете ли вы Azure IoT Edge для VS Code или Azure IoT Tools (предварительный просмотр) для VS ? Если вы используете их, вы могли бы использовать ContextPath в модуле. json для задания контекста сборки docker, соответствующего потока: https://github.com/Microsoft/vscode-azure-iot-edge/issues/137 .