#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 .