У меня есть файлы 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
@BenjaminW. Спасибо! Я не использую Compose для нескольких изображений, только для одного, но buildx Bake имеет переопределение тегов и меток, которые мне нужны, так что это кажется правильным!
Если вы создаете только одно изображение, действие метаданных и/или действие build-push будут довольно мощными.
@BenjaminW. Теперь у меня все работает с помощью buildx Bake (должен ли я отметить это здесь как ответ?). Об этих действиях... Я видел это, но подумал, что, поскольку я использую docker Compose, я хочу использовать «docker Compose build...» вместо build-push-action. Если у него нет поддержки Docker Compose? Или вы думаете, что, поскольку это только один образ, мне следует переключиться с создания Docker на работу только со сборкой Docker и ее опциями?
Вероятно, вы сможете получить тот же результат, но если это работает с Compose и Bake, зачем менять команду-победителя ¯\_(ツ)_/¯
Самый простой ответ на вопрос: нельзя. 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
Поскольку вы создаете несколько изображений, возможно, вы ищете buildx Bake и действие для него?