Как пометить и пометить изображение с помощью CLI docker Compose в файле рабочих процессов GitHubPublish.yaml?

У меня есть файлы Dockerfile и docker-compose.yml, и я пытаюсь создать образ, а затем опубликовать его в реестре контейнеров Github после отправки в репозиторий. У меня есть файлPublish.yaml в .github/workflows, где я его и делаю.

Моя проблема в том, что я хочу использовать метки и теги, которые я получил в результате извлечения метаданных Docker на этапе файла публикации.yaml, а затем добавить эти теги и метки к изображению с помощью docker compose build. Поэтому я не могу просто поместить их в файл docker-compose.


Мой файлPublish.yml выглядит так:

on:
  push: 
    branches: 
      - main
      - docker
    tags:
      - v*

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  build-and-publish-image:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
      attestations: write

    steps:
      - name: Check out the repo
        uses: actions/checkout@v3

      - name: Setup Docker buildx
        uses: docker/setup-buildx-action@v2

      - name: Log in to GitHub Container registry
        uses: docker/login-action@v2
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

      - name: Remove and stop docker compose containers
        run: docker compose -f docker-compose.yml down


      ###This is the problem step:###
      - name: Build Docker image with docker compose
        run: docker compose -f docker-compose.yml --progress=plain build --pull --no-cache --tag ${{ steps.meta.outputs.tags }} --label ${{ steps.meta.outputs.labels }}
        

      - name: Push Docker image
        run: docker push ${{ env.REGISTRY }}/{{env.IMAGE_NAME }}:latest

Я получаю сообщение об ошибке в разделе «Создать образ Docker с помощью Docker Compose» в действиях GitHub:

неизвестный флаг: --tag Ошибка: процесс завершен с кодом выхода 16.

поскольку согласно справочным документам docker compose cli и compose build cli, похоже, что docker compose build не имеет опций --tag или --label, которые есть у docker build.


Посмотрев на это: Docker-compose помечает и нажимает, а также справочную документацию docker-compose cli, я сейчас делаю это вот так:

  ###This is the problem step:###
  - name: Build Docker image with docker compose
    run: |
      docker compose -f docker-compose.yml --progress=plain build --pull --no-cache 
      docker tag ${{env.IMAGE_NAME }} ${{ steps.meta.outputs.tags }}  
  
  - name: Push Docker image
    run: docker push ${{ env.REGISTRY }}/{{env.IMAGE_NAME }}:latest

Но я до сих пор не знаю, как на него поставить метки из ${{ steps.meta.outputs.labels }}. Как мне это сделать? Есть ли лучший способ сделать это в целом?

Я хотел использовать docker/build-push-action@v4 лайк из примера на этом сайте , но мне нужно, чтобы он был построен с помощью Compose. И я не очень понимаю, что делать из ответов здесь: Как пометить изображение докера с помощью docker-compose

Поскольку вы создаете несколько изображений, возможно, вы ищете buildx Bake и действие для него?

Benjamin W. 21.06.2024 19:07

@BenjaminW. Спасибо! Я не использую Compose для нескольких изображений, только для одного, но buildx Bake имеет переопределение тегов и меток, которые мне нужны, так что это кажется правильным!

Ray S 24.06.2024 17:21

Если вы создаете только одно изображение, действие метаданных и/или действие build-push будут довольно мощными.

Benjamin W. 24.06.2024 17:23

@BenjaminW. Теперь у меня все работает с помощью buildx Bake (должен ли я отметить это здесь как ответ?). Об этих действиях... Я видел это, но подумал, что, поскольку я использую docker Compose, я хочу использовать «docker Compose build...» вместо build-push-action. Если у него нет поддержки Docker Compose? Или вы думаете, что, поскольку это только один образ, мне следует переключиться с создания Docker на работу только со сборкой Docker и ее опциями?

Ray S 25.06.2024 18:25

Вероятно, вы сможете получить тот же результат, но если это работает с Compose и Bake, зачем менять команду-победителя ¯\_(ツ)_/¯

Benjamin W. 26.06.2024 05:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самый простой ответ на вопрос: нельзя. Docker-compose CLI не может делать то, что я просил, поэтому я обратился к docker buildx save, который может добавлять теги и метки с помощью опции --set.

В итоге я использовал docker/metadata-action вместе с docker/bake-action, чтобы получить то, что хотел, вместо CLI для запекания Docker. Тем не менее, я включил то, что, по моему мнению, будет эквивалентом моего действия докера в CLI.


Действие метаданных имеет {{ $outputs.labels }} и {{ $outputs.tags }}, которые я использовал изначально.

Но ТАКЖЕ есть выходные данные файлов запекания {{ $outputs.bake-file-tags }} и {{ $outputs.bake-file-labels }}, о которых вы можете прочитать больше здесь: выходные данные метаданных , а больше о файлах запекания можно прочитать здесь.

Эти файлы, используемые с действием выпечка, могут применять несколько тегов и меток, а также создавать и отправлять мое изображение из файла docker-compose.yml, который я написал.

Вот мой обновленный файл yml:

steps:
    - name: Checkout the repository
      uses: actions/checkout@v4

    - name: Setup Docker buildx
      uses: docker/setup-buildx-action@v3

    - name: Log in to GitHub Container registry
      uses: docker/login-action@v3
      with:
        registry: ${{ env.REGISTRY }}
        username: ${{ github.actor }}
        password: ${{ secrets.GITHUB_TOKEN }}

    - name: Extract metadata (tags, labels) for Docker
      id: meta
      uses: docker/metadata-action@v3
      with:
        images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
        tags: |
          # tag with version number upon "git push tag"
          type=match,pattern=v(.*),group=1
          # set latest tag for default branch
          type=raw,value=latest,enable = {{is_default_branch}}
 
    - name: Build & Push Docker image with Github Bake Action
      uses: docker/bake-action@v4
        with:
          source: . 
          push: true
          pull: true
          files: |
            ./docker-compose.yml
            ${{ steps.meta.outputs.bake-file-tags }}
            ${{ steps.meta.outputs.bake-file-labels }}
          targets: myApp

И вот что, по моему мнению, будет эквивалентом CLI этого последнего шага:

    - name: Build Docker image with docker bake
      run: docker buildx bake -f docker-compose.yml -f ${{ steps.meta.outputs.bake-file-tags }} -f ${{ steps.meta.outputs.bake-file-labels }} --progress=plain --pull --push myApp

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