Как изменить расширенные атрибуты файлов в образах Docker в разных архитектурах и сохранить изменения?

Я работаю с образами Docker на разных архитектурах (x86_64 и ARM). Мне нужно изменить расширенные атрибуты (xattrs) некоторых исполняемых файлов в этих образах Docker и сохранить эти изменения, если я не знаю, что поддерживает каждый образ.

Я знаком с основными операциями Docker, такими как создание, запуск и фиксация контейнеров. Однако я не уверен, как конкретно обрабатывать расширенные атрибуты и обеспечивать совместимость между различными архитектурами. Кроме того, я не могу просто открыть контейнер Docker, изменить расширенные атрибуты и зафиксировать эти изменения, поскольку я не уверен, какие команды или сценарии (например, сценарии Python или команды attr) поддерживаются в контейнере.

Может ли кто-нибудь предоставить подробный метод или лучшие практики для достижения этой цели? Мы будем очень признательны за любые примеры команд или сценариев, которые можно использовать внутри контейнера для обработки расширенных атрибутов!

Я пытался запустить докер с помощью bash, но некоторые докеры не поддерживают команды attr. Я также пытался создать скрипт Python, который не работал, так как другие докеры не поддерживали скрипт Python. Что еще я могу сделать?

Chattr(1) работает не так, как вы ожидаете? Практически никогда не следует использовать docker commit. Можете ли вы привести более конкретный пример изменения, которое вы пытаетесь внести: с какого базового образа вы начинаете, какой атрибут вы пытаетесь изменить (и почему) и с какими проблемами вы сталкиваетесь?

David Maze 13.06.2024 11:47

Я пытался использовать setfattr для изменения расширенных атрибутов, а не чата. Я работаю над несколькими докерами, некоторые из них основаны на Ubuntu, некоторые — на Python:3.7, но это не имеет значения, поскольку я ищу решение, не зависящее от самого образа докера. У меня есть приложение безопасности, которое утверждает исполняемые файлы только с определенным xattr, и я работаю над новой функцией, которая должна поддерживать образы Docker. проблема в том, чтобы применить xattr к исполняемым файлам внутри образов докеров (некоторые даже имеют разные архитектуры)

YonL 13.06.2024 12:11

xattrs зависят от файловой системы, не так ли? А докер-контейнер, насколько я понимаю, работает с собственным ядром хост-системы в собственной файловой системе; они не эмулируются. Так что же произойдет, если кто-то попытается запустить ваш контейнер из файловой системы, которая вообще не поддерживает xattr?

Nate Eldredge 15.06.2024 17:24

@NateEldredge Вы правы, это зависит от файловой системы, я предполагаю, что файловая система будет поддерживать расширенные атрибуты, поскольку это одно из требований.

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

Ответы 1

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

Если у вас есть доступ к самим файлам Dockerfile, вы можете внести изменения в файл Dockerfile, чтобы изменить расширенные атрибуты и обеспечить успешное завершение сборки. Чтобы обеспечить совместимость нескольких архитектур для одного образа Docker, вы можете использовать следующую методологию:

  1. Создайте два уникальных файла Dockerfile: один для x86, а другой для Arm.

По мере необходимости обрабатывайте расширенные атрибуты в каждом файле Dockerfile по-разному.

  1. Создайте файл Dockerfile x86_64 на оборудовании x86_64 и убедитесь, что образ после сборки работает должным образом.
docker build -t my-image:amd64 .
docker push my-image:amd64
  1. Создайте файл Dockerfile Arm на оборудовании Arm и убедитесь, что образ после сборки работает должным образом.
docker build -t my-image:arm64 .
docker push my-image:arm64
  1. Объедините изображения и аннотируйте их с помощью Docker Manifest (вы можете сделать это на компьютере x86 или Arm)
docker manifest create my-image:latest my-image:amd64 my-image:arm64
docker manifest annotate my-image:latest my-image:amd64 --os linux --arch amd64
docker manifest annotate my-image:latest my-image:arm64 --os linux --arch arm64
docker manifest push my-image:latest

В конце у вас должен быть my-image образ Docker, который работает как на аппаратных платформах x86, так и на Arm, обрабатывая ваши расширенные атрибуты способами, зависящими от архитектуры, как указано в ваших Dockerfiles.

Альтернативой является использование docker buildx, но вы можете столкнуться с проблемами в этом процессе сборки с несколькими арками, поскольку вам нужно сначала убедиться, что расширенные атрибуты работают непосредственно на различной архитектуре каждого компьютера. buildx строит многоархивные образы с одной машины.

Чтобы получить компьютер ARM для сборки, вы можете выбрать компьютер с архитектурой Arm на AWS или у других поставщиков облачных услуг.

Надеюсь это поможет!

Итак, вы предлагаете добавить расширенные атрибуты из самого файла докеров при создании образов докеров? Что делать, если у меня нет доступа к файлам Docker или сборке?

YonL 16.06.2024 10:16

Правильный; если у вас нет доступа к файлам докеров или сборке, что у вас есть доступ к изменению? Можете ли вы подробнее описать ваш рабочий процесс?

Zach Lasiuk 17.06.2024 15:58

Что ж, я попытался построить поверх данного образа докера, затем добавить свои расширенные атрибуты и попробовал ваш ответ, который решил проблему. Спасибо!

YonL 22.06.2024 16:24

Пожалуйста, рад, что все сработало так, как ожидалось!

Zach Lasiuk 22.06.2024 22:23

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