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 году).
- Щелкните правой кнопкой мыши веб-проект.
- Выберите Добавить.
- Затем "Поддержка докеров". Это автоматически загрузит несколько проектов в контейнер.
Если у вас есть несколько веб-проектов, повторите шаг отдельно для каждого.
Вот ссылка: 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"]