Комментарии 17
если все же оставить команду dotnet restore то у нас останется кеш с нугетами (по-крайней мере если мы используем Canico для сборки докера на CI), не уверен что при dotnet publish скачанные нугеты останутся в кеше
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++
Кстати, есть ли какие-то читы в плане того, чтобы собирать быстрее (например заранее системные либы скопировать или проигнорировать какие-то шаги)? Для сандбокса такого рода штуки очень нужны
От dotnet restore до publish, и что это значит для докера и построения CI/CD-пайплайна