Как кэшировать сборку 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ответы команды;

Другие вопросы по тегам