У меня есть консольное приложение .NET Core 2.1. Я хочу запустить это консольное приложение в образе Docker. Я новичок в Docker и просто пытаюсь понять это.
На данный момент у меня есть Dockerfile, вдохновленный Пример Microsoft. Мой файл на самом деле выглядит так:
FROM microsoft/dotnet:2.1-runtime-nanoserver-1709 AS base
WORKDIR /app
FROM microsoft/dotnet:2.1-sdk-nanoserver-1709 AS build
WORKDIR /src
COPY MyConsoleApp/MyConsoleApp.csproj MyConsoleApp/
RUN dotnet restore MyConsoleApp/MyConsoleApp.csproj
COPY . .
WORKDIR /src/MyConsoleApp
RUN dotnet build MyConsoleApp.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish MyConsoleApp.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "MyConsoleApp.exe"]
Мой вопрос: в чем разница между: microsoft / dotnet: 2.1-runtime-nanoserver-1709, microsoft / dotnet: 2.1-sdk и microsoft / dotnet: 2.1-runtime? Какой из них я должен использовать для своего консольного приложения .NET 2.1? Я не понимаю, если я а) создаю свое консольное приложение, а затем разверну его в образе докера или б) создаю образ докера, получу код и создаю консольное приложение на самом образе. Любая помощь приветствуется.
Речь идет не о самом докере, а об образах докеров .net
Вы можете перейти к https://hub.docker.com/r/microsoft/dotnet/, щелкнуть по конкретному изображению, найти Dockerfile и понять, что именно программное обеспечение построено в этом образе, и найти разницу между разными Dockerfile.
Что касается второго вопроса, лучше «создать образ докера, получить код и построить консольное приложение на самом образе». Итак, вы создаете образ, открываете порт, монтируете свой код как том, и ваш код выполняется внутри контейнера с помощью программного обеспечения, установленного в контейнере.
microsoft / dotnet: 2.1-runtime-nanoserver-1709 - этот образ используется для настройки среды выполнения .net, в которой работает любое приложение .net.
microsoft / dotnet: 2.1-sdk-nanoserver-1709 - этот образ представляет собой SDK, используемый для компиляции вашего основного приложения .net.
Обратитесь к этот блог, чтобы узнать, как создать и запустить приложение консоли ядра .net в докере:
Мой ответ на первый вопрос:
microsoft/dotnet:2.1-runtime-nanoserver-1709
- это образ докера, в котором можно запускать основные приложения .net,
microsoft/dotnet:2.1-sdk-nanoserver-1709
- это образ докера, который вы создаете для приложений, вы также можете запускать с ним приложения.
И мой ответ на второй вопрос:
Если вы просто хотите запустить приложение в докере, создайте свое приложение с помощью Visual Studio на локальном компьютере (это будет самый простой способ его создания), используйте microsoft/dotnet:2.1-runtime-nanoserver-1709
, создайте образ докера.
Я поместил на Github пример того, как это сделать для приложения webapi .net core, поэтому для консольного приложения должно быть примерно то же самое.
Мой файл докеров выглядит так:
https://github.com/MikeyFriedChicken/MikeyFriedChicken.DockerWebAPI.Example
Это примерно то же самое, что и у вас.
Просто чтобы прояснить предыдущие ответы, то, что делает ваш файл докеров, создает «временные» образы, которые позволяют создавать ваше программное обеспечение. Как только все будет построено, эти изображения просто утилизируются.
Если вы посмотрите на свои последние строки в файле dockerfile, вы увидите, что он копирует выходные данные из образов сборки в ваш окончательный образ, основанный на 'microsoft / dotnet: 2.1-runtime-nanoserver-1709', который имеет достаточно библиотек и зависимостей для запуск вашего основного приложения .net.
Для всех, кто интересуется актуальной ссылкой на Dockerfile
:
FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /app
COPY <your app>.csproj .
RUN dotnet restore <your app>.csproj
COPY . .
RUN dotnet publish -c Release -o out
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS runtime
WORKDIR /app
COPY --from=build /app/out ./
ENTRYPOINT ["dotnet", "<your app>.dll"]
так что ENTRYPOINT .. "находит" статический основной метод (внутри Program.cs) .......... внутри "<your app> .dll"? Это волшебство?
да, так же, как когда вы просто запускаете dll из отладчика или командной строки
обратите внимание на использование правильной версии ядра .NET в базовых образах (2.1, 2.2 и т. д.)