Asp.net core 2.0 - файл докеры с несколькими проектами

[asp.net core 2.0 и докер для Linux]

Я совершенно новичок в докере и пытаюсь понять, как использовать докер в случае, когда у меня есть решение с двумя проектами. Все обучающие программы, которые я видел, показывают один проект.

Итак, если кто-то может показать пошаговое решение, я был бы очень признателен.

У меня есть структура решения вроде:

Solution.sln
|______WebAPIProject.csproj
|______ClassLibraryProject.csproj

В Visual Studio я добавил поддержку докеров для решения и получил эти файлы:

В WebAPIProject он создал этот файл Docker:

FROM microsoft/aspnetcore:2.0
ARG source
WORKDIR /app
EXPOSE 80
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "WebAPIProject.dll"]

то в отдельном файле проекта "docker-compose" у меня есть:

Докер-compose.ci.build.yml

version: '3'

services:
  ci-build:
    image: microsoft/aspnetcore-build:1.0-2.0
    volumes:
      - .:/src
    working_dir: /src
    command: /bin/bash -c "dotnet restore ./Solution.sln && dotnet publish ./Solution.sln -c Release -o ./obj/Docker/publish"

и файл docker.compose.yml

version: '3'

services:
  WebAPIProject:
    image: WebAPIProject
    build:
      context: ./WebAPIProject
      dockerfile: Dockerfile

Я уверен, что это что-то тривиальное с путями, но я просто потерял все это, поэтому, если кто-то может пролить свет на него?

Ответ 1

Я наконец нашел способ, как создавать решения с помощью докера.

ВАЖНО: чтобы это работало, вы должны поместить файл Dockerfile в то же место, где находится файл решения.

Я только что создал файл Docker со следующим содержанием:

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY Solution.sln ./
COPY ClassLibraryProject/*.csproj ./ClassLibraryProject/
COPY WebAPIProject/*.csproj ./WebAPIProject/

RUN dotnet restore
COPY . .
WORKDIR /src/ClassLibraryProject
RUN dotnet build -c Release -o /app

WORKDIR /src/WebAPIProject
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

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

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

Пример вызова для сборки:

sudo docker build --no-cache -t webapi:dev .

Пример вызова для запуска:

sudo docker run -d=false -p 8080:80 --name webapi webapi:dev

Надеюсь, это поможет.

Ответ 2

Хотя я понимаю, что ядро dotnet не является специфическим для Windows, и не все будут использовать Visual Studio, есть эта замечательная функция, которую Microsoft включила в Visual Studio (опробовано в 2017 году).

  1. Щелкните правой кнопкой мыши веб-проект.
  2. Выберите Добавить.
  3. Затем "Поддержка докеров". Это автоматически загрузит несколько проектов в контейнер.

Если у вас есть несколько веб-проектов, повторите шаг отдельно для каждого.

Вот ссылка: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/docker/visual-studio-tools-for-docker?view=aspnetcore-2.1#existing-app

Если вы столкнулись с какими-либо проблемами при запуске контейнера Docker, попробуйте отменить выбор Hyper-V Services в "Компонентах Windows" (Поиск Windows Features в меню "Пуск"), выбрать снова, а затем перезагрузить компьютер. Проверьте здесь.

enter image description here

Ответ 3

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

RUN mkdir /output

# Copy project and publish

COPY . /app

WORKDIR /app/YourProjectName
RUN dotnet publish --configuration Debug --output /output

# Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime

ENV ASPNETCORE_URLS http://*:5001

WORKDIR /app

COPY --from=build-env /output .
EXPOSE 5001

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

Это конфигурация Docker, которая работала для меня. Это был проект ASP.NET Core 2 WebApi со многими дочерними ссылками.

Then run it using  docker run -d -p 8080:5001 --name some-name yourpojectname

Надеюсь, это кому-нибудь поможет.

Ответ 4

Это ссылка на удивительный пост о том, как решить эту проблему.

Он упоминает о размещении всего вашего кода в каталоге src. Я этого не сделал, и это файл, который я придумал: (ключ for file части for file. Я уверен, что это не лучший dockerfile в противном случае; советы приветствуются.)

FROM microsoft/dotnet:2.2-aspnetcore-runtime-stretch-slim AS base
WORKDIR /app
EXPOSE 5000

FROM microsoft/dotnet:2.2-sdk-stretch AS build
WORKDIR /src

COPY ./*.sln ./

COPY */*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p ${file%.*} && mv $file ${file%.*}; done
RUN dotnet restore

COPY . ./
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .

ENV ASPNETCORE_URLS="http://*:5000"
ENTRYPOINT ["dotnet", "PersonalSiteApi.dll"]