Как кэшировать сборку docker-compose внутри github-action
Есть ли способ кэшировать docker-compose, чтобы он не собирался снова и снова? вот мой файл рабочего процесса действий:
name: Github Action
on:
push:
branches:
- staging
jobs:
test:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v1
- name: Bootstrap app on Ubuntu
uses: actions/setup-node@v1
with:
node-version: '12'
- name: Install global packages
run: npm install -g yarn prisma
- name: Install project deps
if: steps.cache-yarn.outputs.cache-hit != 'true'
run: yarn
- name: Build docker-compose
run: docker-compose -f docker-compose.test.prisma.yml up --build -d
Я хочу кэшировать этап сборки докера. Я пробовал использоватьif: steps.cache-docker.outputs.cache-hit != 'true' then only build
но не сработало.
4 ответа
То, что вы имеете в виду, называется "кэшированием уровня докеров", и оно еще не поддерживается в GitHub Actions.
Это широко обсуждается в нескольких местах, например:
Этот вопрос старый, но я обнаружил, что пытаюсь решить точно такую же проблему. Прочитав много разных ответов и потратив много времени, я в конце концов нашел достойное решение.
Мой рабочий файл теперь выглядит так:
jobs:
build:
name: Integration tests
runs-on: ubuntu-22.04
# I need "packages: write" to access GHCR.
# More about permissions here: https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs
permissions: write-all
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Docker Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/checkout@v2
- name: Build docker-compose
# Before the cache, it was "run: docker compose build".
run: docker buildx bake --file docker-compose.yml --file docker-compose-cache.json
...
И в файле у меня есть следующее:
{
"target": {
"service-name": {
"cache-from": [
"type=registry,ref=ghcr.io/MY_GITHUB_ORG_NAME/service-name:cache"
],
"cache-to": [
"type=registry,ref=ghcr.io/MY_GITHUB_ORG_NAME/service-name:cache"
],
"output": [
"type=docker"
]
}
}
Для каждой службы в , я добавляюtarget
в .docker buildx bake
получает инструкции по сборке отdocker-compose.yml
и кешировать инструкции изdocker-compose-cache.json
.
Таким образом, я все еще могу использоватьdocker-compose up --build
локально, как обычно.
Как вы могли заметить, я использую реестр контейнеров GitHub вместо кеша действий GitHub, потому что GHCR не имеет ограничений на размер кеша.
Для тех, кто прибывает сюда через Google, теперь это «поддерживается». Или, по крайней мере, он работает: https://github.community/t/use-docker-layer-caching-with-docker-compose-build-not-just-docker/156049. Идея состоит в том, чтобы создавать образы с помощью docker (и его кеша), а затем использовать docker compose для их запуска.
При использованииdocker/bake-action
илиdocker/build-push-action
и хотите получить доступ к кэшированному изображению на следующих шагах -
- Использовать
load:true
сохранить изображение - Используйте то же имя изображения, что и кэшированное изображение, на всех этапах, чтобы пропустить перестроения.
Пример:
...
name: Build and push
uses: docker/bake-action@master
with:
push: false
load: true
set: |
web.cache-from=type=gha
web.cache-to=type=gha
-
name: Test via compose
command: docker compose run web tests
...
services:
web:
build:
context: .
image: username/imagename
command: echo "Test run successful!"
См.docker
ответы команды;