Туториалы что-то не помогают, как правильно работать с докером для .net core?
Привет, котаны.
Начал изучать докер, но никак не получается структурировать информацию помогите
Вот у меня есть приложение, которое состоит из бекенда, это .net core api, плюс в решении находятся два проекта с тестами (юнит и интеграционные). Я могу запускать свое апи локально и дебажить при необходимости, но если я упакую свое приложение в докер, то я же не смогу его отлажить (либо там какие-то приседания нужны, о которых в туториалах для чайников не рассказывают).
То есть, разрабатывать намного удобнее без докера, даже если я разрабатываю на винде, а потом при публикации на линукс уже можно собирать докер образ, окей. В этом моменте я правильно понимаю, или все же себе люди настраивают и отладку в докере как-то?
Так же при сборке образа в туториалах копируют вообще все файлы из решения (за исключением папок bin и obj) и дальше там делают все тот же dotnet publish, но напоминаю, у меня в решении содержатся проекты с тестами, например, да и вообще, последовательность действий получается такая:
мы создаем пустой контейнер,
устанавлиаваем туда .net core SDK,
копируем файлы исходного кода
билдим (с установкой нугет пакетов, разумеется)
потом делаем dotnet publish с флагом релиз в какую-то папку, эта команда по сути сделает сборку, которую можно использовать где-то на сервере (в нее не войдут либы тестов, насколько я понимаю)
Но это еще не всё, чтобы наша сборка запустилась, мы еще ставим .net core runtime, натравливаем его на эту папку, ну и прокидываем какой-то порт, разумеется
Тут у меня непонимание, что по итогу внутри контейнера остается весь исходный код, включая проекты тестов, остается .net SDK, который нужен был для билда, и это уже под 200 лишних метров, наверно. Тут все просто ленятся вычищать ненужное или что?
Правильно ли я понимаю, что, допустим, если мы используем git hub actions, нам дают чистую виртуалку, мы на нее ставим SDK нужной версии, билдим проект, над этим проектом запускаем тесты, если всё хорошо, тогда делаем dotnet publish и только после этого создаем пустой докер контейнер, ставим на него только runtime нужной версии, копируем только те файы, которые нам сделал publish и это будет минимальный образ, который и нужно будет ставить на сервер (ну вначале точнее его куда-то просто загружать, типа в докер хаб)
Окей, вот я открываю официальную документацию, там есть пункт, что можно сделать отдельно дотнет паблиш и с него собрать докер имадж, который можно использовать.
Но ниже идет раздел The Dockerfile, в котором описывается, что мы сначала должны ставить sdk, затем билдить, после этого делать паблиш и уже это использовать. Это лишние 200 метров, об этом я и спрашиваю, зачем? Даже на винде я могу сбилдить приложение под линукс или арм, под x86 или x64 и загрузить только необходимые файлы в докер-образ. Тут же в официальной документации (которая потом везде просто копируется) говорят, что нужно билдить внутри докер-контейнера. После билда ненужные файлы не чистятся, это увеличение итогового образа более, чем в 2 раза. Типа всем плевать на объем образа или что?
Виктор П., вы немного не дочитали: да, в контейнер нужно установить sdk, чтобы собрать апп, но потом в этом же контейнере запускается сборка образа, внутрь которого копируется только собранный апп
т.е первый build-контейнер "грязный" - в нём sdk, исходники, и прочее неоходимое для сборки, а второй "чистый" - в нём только net runtime и бинари аппа:
Сергей В, Спасибо большое, теперь я похоже догнал
Когда читал про докер, везде пишется, что образ собирается по слоям, берется базовый образ и на него накручиваются слои. Эта парадигма сильно укрепилась в голове.
Теперь я нашел, что команда FROM не относится к этим слоям, а считается как многоступенчатая сборка, то есть, имея несколько инструкций FROM мы копируем какие-то только необходимые артефакты, избавляясь по прохождению этих шагов от ненужного. Тут было не очевидно, что в результат попадет только последний шаг.
Получается, что на размер образа не будет влиять, сделаю ли я сборку на своей тачке и засуну в докер только нужные файлы из папки паблиша, либо внутри докера сделаю многоступенчатую сборку, окей
Создайте отдельный ответ, отмечу его решением
Сергей В, но... если я делаю паблиш у себя и копирую только получившиеся файлы в докер с базовым рантаймом, то образ весит 31 мегабайт.
Если же я делаю по твоей картинке, то образ занимает чуть более 900 метров.
Меня все еще не покидает чувство, что туториалы меня обманывают. По факту второй образ я делаю на локальной машине и он в итоге собирается, но не могу запустить, возможно что-то делаю не так
И вызываю это из git hub actions, тогда в хабе пишет 86 метров, но это compressed. После того, как скачал образ на комп, он весит так же, как и первый, 218.47 Мб
(31 метр это видимо перчая строчка в слоях в докер хабе была, хотя сейчас там стоит 29, не понимаю, где вообще это число увидел).
В общем, вроде разобрался