#docker #github-actions
#docker #github-действия
Вопрос:
Я думаю, что это будет полезно для многих других.
Я использую https://github.com/phips28/gh-action-bump-version для автоматического изменения версий NPM в действиях Github.
Есть ли способ кэшировать образ docker этого действия, чтобы его не нужно было создавать каждый раз? Для запуска требуется много времени, и он выполняется заранее перед выполнением остальных шагов. Я уверен, что это характерно для аналогичных типов действий Github, которые извлекают изображения docker.
Изображение docker выглядит довольно тонким, поэтому я не уверен, что попытка оптимизировать само изображение принесет какую-либо пользу. Больше связано с тем, как настроить действия Github.
Есть предложения?
Ответ №1:
TLDR
Несколько! Вы можете изменить файл рабочего процесса GitHub на pull
изображение из репозитория вместо building
каждого запуска. Хотя это не кэширует изображение, оно значительно быстрее. Это может быть достигнуто путем редактирования вашего потока, чтобы он выглядел следующим образом:
- name: 'Automated Version Bump'
id: version-bump
uses: 'docker://phips28/gh-action-bump-version:master'
with:
tag-prefix: 'v'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Пожалуйста, обратите внимание на docker://
префикс uses:
инструкции в сочетании с изменением с @master
:master
на, чтобы преобразовать имя в допустимое имя изображения.
Я открыл PR в этом репозитории с предлагаемым исправлением : ^)
Оригинальный ответ
Очень хороший вопрос, и в официальных документах можно найти мало информации (хотя GitHub признает задержку в своих документах).
Ответ сотрудников GitHub
Я искал вас, и мне удалось найти статью от сентября 2019 года на форуме сообщества GitHub именно на эту тему. Это неизбежно связано с этой статьей от июля 2019 года.
Существует замечательное объяснение того, как при каждом построении все равно будет использоваться кэш сборки docker, Что сокращает время, но обеспечивает гибкость с точки зрения использования последней версии базового образа и т. Д. И т. Д.
Существует предлагаемое решение, если вас не беспокоит гибкость обновлений, и вы просто хотите как можно меньше времени сборки, хотя я не уверен, что этот синтаксис все еще действует в настоящее время:
Но, допустим, я не хочу, чтобы мое действие даже оценивало Dockerfile каждый раз при выполнении действия, потому что я хочу максимально быстрое время выполнения. Я хочу, чтобы предварительно определенный контейнер Docker был развернут и сразу приступил к работе. У вас тоже может быть это! Если вы создаете образ Docker и загружаете его в Docker Hub или другой общедоступный реестр, вы можете указать своему действию использовать этот образ Docker, используя форму docker:// в ключе uses . Подробности см. В документации по GitHub Actions 72. Это требует немного больше предварительной работы и обслуживания, но если вам не нужна гибкость, которую предоставляет вышеупомянутая система оценки Dockerfile, то, возможно, стоит пойти на компромисс.
К сожалению, ссылка на документацию Github actions не работает, но это говорит о том, что автор действия мог бы разрешить такое поведение, если бы они изменили свое действие
Альтернативные идеи
Если вам требуется возможность управлять кэшем на хосте-исполнителе (чтобы действительно кэшировать изображение), тогда вы можете подумать о размещении собственного GitHub runner, поскольку у вас будет полный контроль над изображениями там. Хотя я полагаю, что это потенциально является препятствием, учитывая, что GitHub actions в значительной степени является бесплатным сервисом (с ограничениями, и это, возможно, одно из них!)
Возможно, вы захотите добавить задачу, которая использует действие файлового кэша, и попытаться экспортировать gh-action-bump-version в содержимое файла через . Редактировать: теперь, когда мы знаем, что действия могут поддерживать извлечение изображений из реестров, это ужасная идея. docker commit
или docker save
, а затем повторно наполнить его при следующем запуске. Однако это создает сложности и может не сэкономить ваше время в долгосрочной перспективе.
Я надеюсь, что это поможет вам и всем, кто ищет дополнительную информацию 👍
Комментарии:
1. Другой вариант — использовать другой dockerfile для создания образа, опубликовать его, а затем использовать его в качестве
FROM
файла Dockerfile действия. Что вы думаете?2. Вы правы, в конечном итоге это приводит к извлечению изображения без необходимости редактирования yaml. Это добавляет немного больше «сложности» для автора действия и потенциально может занять немного больше времени, чем извлечение изображения с самого начала, поскольку для этого все равно потребуется проверка репозитория действий
3. Я также обнаружил, что вы можете поместить изображение docker
action.yml
и, кажется, быстрее, вот пример: github.com/strawberry-graphql/release-cards/blob/main /…4. Я полагаю, что это делает то же самое, с другим синтаксисом, хорошая находка! Нашли ли вы какую-либо документацию GitHub, показывающую, что это возможно? Мы должны подумать о том, чтобы отправить изменение, чтобы попытаться сделать очевидным, что это возможно
5. да, это задокументировано здесь: docs.github.com/en/actions/creating-actions /… 🙂
Ответ №2:
В блоге docker есть отличная статья, объясняющая, как кэшировать изображения docker с помощью actions / cache и buildx (что позволяет указать пользовательский путь к кешу). Его можно найти здесь: https://www.docker.com/blog/docker-github-actions /.
Комментарии:
1. Я не думаю, что это ответ, который ищет Сол Фрэнк. В этой статье показано, как кэшировать слои при создании образа Docker, тогда как здесь мы хотим использовать внешнее действие, использующее Docker, и это действие встроено в этап «настройки», который мы не контролируем.