Azure Devops Build Pipeline - проблема со сборкой docker со ссылочными проектами - PullRequest
0 голосов
/ 23 апреля 2020

Я совершенно новый в докере / azure DevOps строит конвейеры. Но я должен признать, это болезненный путь. Предполагается, что это легко, и это не так:)

Чего я хочу добиться - это построить только один проект, в котором есть один ссылочный проект в решении. Но я не хочу создавать полное решение (так как у меня есть проекты Xamarin, для создания которых требуется немного больше времени). Что касается SLN - я полагаю, ответ будет легче найти.

У меня было это конвейер работал, когда был только один проект без ссылок на другие проекты. Но сейчас, как я упомянул один, он ломается.

Только для записей, я использую конвейер сборки для создания образа docker и его развертывания в Azure Реестр контейнеров. Но это не важно, я полагаю, потому что он не работает при сборке.

Структура моего кода

  • Решение

    • [Project] BuildChat <- Ссылочный проект от SignalR </li>
    • [Проект] Xamarin. IOS
    • [Проект] Xamarin. Android
    • [Проект] SignalRChat
      • [Файл] Docker

Мой исходный файл был создан с помощью Docker Поддержка надстройки на VS (предлагается здесь: asp. net core 2.0 - решение для нескольких проектов docker file )

Конечно, когда я впервые использовал его, на него не ссылались проекты. Поэтому я подумал, хорошо, может быть, я просто удалю файл docker и снова воспользуюсь поддержкой Add -> Docker. И он изменил dockerfile, включив в него ссылочный проект (называемый BuildChat)

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

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

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 ["SignalRChat/SignalRChat.csproj", "SignalRChat/"]
COPY ["BuildChat/BuildChat.csproj", "BuildChat/"]
RUN dotnet restore "SignalRChat/SignalRChat.csproj"
COPY . .
WORKDIR "/src/SignalRChat"
RUN dotnet build "SignalRChat.csproj" -c Release -o /app/build

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SignalRChat.dll"]

Но он не работает. Возможно, потому что docker не может go вне контекста. Но опять же, поддержка docker не знает этого?: D

Я полагаю, что один из вариантов - переместить его на уровень SLN, а затем использовать docker build с -f, чтобы указать файл ( я видел это как предложение) но я не знаю, как включить его в azure конвейер сборки.

Может быть, есть другие мысли о том, как этого добиться (в этом docker "привет мировая »программа, которая оказывается очень сложной: D)

Мой текущий конвейер сборки выглядит следующим образом:

# Docker
# Build a Docker image 
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker

trigger:
- master

resources:
- repo: self

variables:
  dockerRegistryServiceConnection: 'MyProductDockerACR'
  imageRepository: 'mobile/signalr'
  containerRegistry: 'myAcrName.azurecr.io'
  dockerfilePath: '**/Dockerfile'
  tag: '$(Build.BuildNumber)'
  vmImageName: 'ubuntu-latest'

stages:
- stage: Build
  displayName: Build and push stage
  jobs:  
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push image to container registry
      inputs:
        containerRegistry: $(dockerRegistryServiceConnection)
        repository:  $(imageRepository)
        command: 'buildAndPush'
        Dockerfile: $(dockerfilePath)
        tags: |
          $(tag)

, и ошибка, создаваемая конвейером сборки, равна (сокращено до представьте интересную часть :)):

Starting: Build and push image to container registry
==============================================================================
Task         : Docker
Description  : Build or push Docker images, login or logout, or run a Docker command
Version      : 2.166.1
Author       : Microsoft Corporation
Help         : https://aka.ms/azpipes-docker-tsg
==============================================================================
/usr/bin/docker build -f /home/vsts/work/1/s/SignalRChat/Dockerfile --label com.azure.dev.image.system.teamfoundationcollectionuri=https://dev.azure.com/myAzureDevops/ --label com.azure.dev.image.system.teamproject=Mobile --label com.azure.dev.image.build.repository.name=Mobile --label com.azure.dev.image.build.sourceversion=e1fcddf1507478434251b2c12a3f999ef23f7b70 --label com.azure.dev.image.build.repository.uri=https://myAzureDevops@dev.azure.com/myAzureDevops/Mobile/_git/Mobile --label com.azure.dev.image.build.sourcebranchname=master --label com.azure.dev.image.build.definitionname=Mobile --label com.azure.dev.image.build.buildnumber=20200423.7 --label com.azure.dev.image.build.builduri=vstfs:///Build/Build/26 -t ***/mobile/signalr:20200423.7 /home/vsts/work/1/s/SignalRChat
Sending build context to Docker daemon  2.509MB

[...]

Status: Downloaded newer image for mcr.microsoft.com/dotnet/core/sdk:3.1-buster
 ---> 4aa6a74611ff
Step 6/27 : WORKDIR /src
 ---> Running in abca9a0a7296
Removing intermediate container abca9a0a7296
 ---> 15699d4bddc2
Step 7/27 : COPY ["SignalRChat/SignalRChat.csproj", "SignalRChat/"]
COPY failed: stat /var/lib/docker/tmp/docker-builder654251088/SignalRChat/SignalRChat.csproj: no such file or directory
##[error]COPY failed: stat /var/lib/docker/tmp/docker-builder654251088/SignalRChat/SignalRChat.csproj: no such file or directory
##[error]The process '/usr/bin/docker' failed with exit code 1

[ОБНОВЛЕНИЕ 14:00]

Перемещение файла docker на уровень решения устраняет проблему. Но вопрос остается. Что если я захочу докеризовать еще один проект? Как действовать дальше?

1 Ответ

1 голос
/ 23 апреля 2020

Я думаю, что у вас может быть неправильный порядок здесь

COPY ["SignalRChat/SignalRChat.csproj", "SignalRChat/"]
COPY ["BuildChat/BuildChat.csproj", "BuildChat/"]

Например, у меня есть два проекта

  • SomeLib.csproj - на него ссылается WeatherService.csproj
  • WeatherService.csproj

Для этого заказа:

COPY ["WeatherService/WeatherService.csproj", "WeatherService/"]
COPY ["SomeLib/SomeLib.csproj", "SomeLib/"]

Я получил это:

enter image description here

Но для этого заказа это работает

COPY ["SomeLib/SomeLib.csproj", "SomeLib/"]
COPY ["WeatherService/WeatherService.csproj", "WeatherService/"]

enter image description here

Можете ли вы попробовать изменить COPY заказ:

COPY ["BuildChat/BuildChat.csproj", "BuildChat/"]
COPY ["SignalRChat/SignalRChat.csproj", "SignalRChat/"]

РЕДАКТИРОВАТЬ :

Я протестировал то, что написал выше непосредственно на Azure DevOps, и все прошло нормально.

Это мой DockerFile:

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

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src
COPY ["SomeLib/SomeLib.csproj", "SomeLib/"]
COPY ["WeatherService/WeatherService.csproj", "WeatherService/"]
RUN dotnet restore "WeatherService/WeatherService.csproj"
COPY . .
WORKDIR "/src/WeatherService"
RUN dotnet build "WeatherService.csproj" -c Release -o /app/build

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WeatherService.dll"]

Это структура проекта:

Project structure

И файл YAML:

- task: Docker@2
  displayName: Build and Push
  inputs:
    repository: $(imageName)
    command: build
    Dockerfile: docker-multiple-apps/Dockerfile
    tags: |
      build-on-agent

Все, что вы можете найти здесь .

Это журнал из Azure DevOps

log from Azure DevOps

Можете ли вы сравнить это с вашим подходом? Извините, что я не могу указать вам прямо на root причину, но это работает в моем справочном проекте.

EDIT2:

Как называется ваше решение? Это SignalRChat? И это ваша root папка?

/home/vsts/work/1/s/SignalRChat/Dockerfile

Возможно, ваш путь к Dockerfile неверен?

...