Как стать автором
Обновить

Комментарии 17

если все же оставить команду dotnet restore то у нас останется кеш с нугетами (по-крайней мере если мы используем Canico для сборки докера на CI), не уверен что при dotnet publish скачанные нугеты останутся в кеше

Под кешем имеется в виду закешированный layer контейнера? Но он же инвалидируется из-за `COPY . .` и кроме вырожденных случаев переиспользоваться не будет

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS publish
WORKDIR /src
COPY . .
RUN dotnet publish ConsoleApp1/ConsoleApp1.csproj -c Release -o /app/publish

FROM mcr.microsoft.com/dotnet/runtime:8.0 AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "ConsoleApp1.dll"]

Разве такого файла недостаточно для контейнера без всякого лишнего и необходимости прописывать явно стадии сборки?

Достаточно. Но чтобы все было «более читаемым» и можно было сразу определить на каком именно моменте что то пошло не так - делают примерно как описано в статье. Даже райдер делает автоматический докерфайл примерно таким

Достаточно. dotnet restore отдельным шагом - это просто небольшая оптимизация сборки контейнера, смысл которой в том, что зависимости у вас скорее всего меняются реже, чем код, поэтому их можно закешировать в отдельном слое.

Причём у автора это реализовано неправильно, потому что он перед рестором копирует все файлы (обратите внимание на COPY . .), инвалидируя этим самым кеш с зависимостями. Лучше обратиться к доке Microsoft.

Подскажите подробнее, что вас именно смутило? Просто я копирую все что связано со сборкой. Нугет пакеты после рестора уйдут в свою папку, которую я не трогаю

Слой кешируется по хешу, который зависит от всех файлов. Поменяли букву в Program.cs - хеши всех последующих слоёв после COPY . . поменялись, а значит restore будет запущен заново, etc.

а подскажите, пожалуйста, на каком уровне будет кэширование слоя? если мы попадем на другой раннер, он выполнит все с начала?

На уровне докер хоста. Так что несколько CI раннеров будут иметь отдельные кэши.

*Если только не извращаться с монтированием общей папки кэша для них, но для этого нужна multi read, multi write хранилка нормальная что как будто не стоит того. А обычный NFS скорей всего своими тормозами убъёт весь выигрыш от кеширования.

Понял, спасибо)

спасибо за подсказку, в статье этот момент исправил

Так забавно, что вчера в свою песочницу https://codiew.io/ide прикручивал net 6 (не знал про 8, спасибо) и проделал по сути ваш урок, но с чатом гпт за часик.

Код билда и запуска (в формате моего окружения): https://github.com/codiewio/codenire/blob/main/sandbox/dockerfiles/net_6/config.json

Код докерфайла: https://github.com/codiewio/codenire/blob/main/sandbox/dockerfiles/net_6/Dockerfile

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

Самое печальное, что докерные контейнеры с дотнетом не взлетели в докерном рантайме gvisor от гугла, и этот вопрос требует отдельного изучения, тк пока не работает из включенных языков песочницы он и свежий 23 C++

Кстати, есть ли какие-то читы в плане того, чтобы собирать быстрее (например заранее системные либы скопировать или проигнорировать какие-то шаги)? Для сандбокса такого рода штуки очень нужны

есть чит - монтирование папки кеша нугет пакетов.

спасибо большое! это кажется очень здорово может ускорить сборку

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации