Можно ли дополнительно указать платформу сборки для службы в файле Docker Compose?

Я хотел бы условно создавать образы Docker, определенные в файле Compose, для разных платформ. Например, для создания рабочих образов и отправки их в репозиторий контейнера используйте linux/amd64, а для создания образов разработки используйте собственную платформу хоста.

Для отдельных сборок образа Docker Docker docker рекомендует использовать параметр --platform CLI. Однако для Compose единственным способом указать платформу сборки является параметр уровня обслуживания platform.

Я полагаю, что для динамической установки этого параметра можно использовать флаг --env-filedocker compose CLI, при этом в файле компоновки указывается platform: ${BUILD_PLATFORM}, а в файле среды содержится что-то вроде BUILD_PLATFORM = "linux/amd64". Однако это не позволяет использовать опцию «использовать хост-платформу по умолчанию».

Есть ли другой подход, который позволял бы указывать платформу только по желанию, аналогично опущению --platform при использовании команды docker build, не являющейся Compose?

«Например, для создания рабочих образов и отправки их в репозиторий контейнеров» — это описание конвейера CI, а не то, что разработчики должны запускать с помощью файла компоновки на своей рабочей станции. А в рабочей среде вы, вероятно, захотите создавать многоплатформенные образы.

BMitch 30.05.2024 15:45

@BMitch Я не говорил, что команда создания запускается только на машине разработчика. Один и тот же файл Compose может использоваться как разработчиками, так и конвейером CI. Необходимость иметь возможность определить хост-платформу по умолчанию актуальна независимо от того, кто ее запускает и где не имеет отношения к вопросу.

goose_lake 31.05.2024 22:51

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

BMitch 01.06.2024 00:27

@BMitch, извини, нет необходимости обсуждать это дальше.

goose_lake 01.06.2024 00:44
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
2
4
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Для достижения этой цели вы должны иметь возможность использовать значение интерполяции Compose по умолчанию.

Что-то вроде:

    ...
    platform: ${BUILD_PLATFORM:-}
    ...

У меня это сработало в Debian 12. Я смог собрать с помощью BUILD_PLATFORM=linux docker-compose build, BUILD_PLATFORM=arm docker-compose build и docker-compose build, но не BUILD_PLATFORM=nope docker-compose build. Поддельное значение приводит к ошибке и печатается следующее сообщение: "nope": unknown operating system or architecture: invalid argument.

Указание platform: '' также приводит к поведению «по умолчанию», которое вам нужно.

Мило спасибо! Попробовал это, и это работает.

goose_lake 31.05.2024 22:43

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

Docker compose -f docker-compose,yaml up error: сервис том Services.database.volumes.[0] отсутствует цель монтирования
Как использовать переменные из файла .env, расположенного в родительском каталоге, при включении других файлов Compose в дочерние каталоги с помощью docker-compose
Docker-compose не завершается при создании компонента next.js
Попытка сохранить данные контейнера докеров
Невозможно установить соединение между приложением Spring Boot, работающим в контейнере Docker, и базой данных PostgreSQL, работающей в другом контейнере Docker
Docker Compose - контейнер A «не смог разрешить хост» контейнера B
Запустите контейнер Docker после его сохранения
Проблема с подключением контейнера golang к контейнеру mysql
Ошибка прокси при контейнеризации бэкэнда FastAPI и фронтенда React Vite
Ошибка «MongoServerError: этот узел не был запущен с включенной репликацией». при настройке набора реплик в mongodb (с использованием Docker Compose)

Похожие вопросы