Я работаю с образами Docker на разных архитектурах (x86_64 и ARM). Мне нужно изменить расширенные атрибуты (xattrs) некоторых исполняемых файлов в этих образах Docker и сохранить эти изменения, если я не знаю, что поддерживает каждый образ.
Я знаком с основными операциями Docker, такими как создание, запуск и фиксация контейнеров. Однако я не уверен, как конкретно обрабатывать расширенные атрибуты и обеспечивать совместимость между различными архитектурами. Кроме того, я не могу просто открыть контейнер Docker, изменить расширенные атрибуты и зафиксировать эти изменения, поскольку я не уверен, какие команды или сценарии (например, сценарии Python или команды attr) поддерживаются в контейнере.
Может ли кто-нибудь предоставить подробный метод или лучшие практики для достижения этой цели? Мы будем очень признательны за любые примеры команд или сценариев, которые можно использовать внутри контейнера для обработки расширенных атрибутов!
Я пытался запустить докер с помощью bash, но некоторые докеры не поддерживают команды attr. Я также пытался создать скрипт Python, который не работал, так как другие докеры не поддерживали скрипт Python. Что еще я могу сделать?
Я пытался использовать setfattr для изменения расширенных атрибутов, а не чата. Я работаю над несколькими докерами, некоторые из них основаны на Ubuntu, некоторые — на Python:3.7, но это не имеет значения, поскольку я ищу решение, не зависящее от самого образа докера. У меня есть приложение безопасности, которое утверждает исполняемые файлы только с определенным xattr, и я работаю над новой функцией, которая должна поддерживать образы Docker. проблема в том, чтобы применить xattr к исполняемым файлам внутри образов докеров (некоторые даже имеют разные архитектуры)
xattrs зависят от файловой системы, не так ли? А докер-контейнер, насколько я понимаю, работает с собственным ядром хост-системы в собственной файловой системе; они не эмулируются. Так что же произойдет, если кто-то попытается запустить ваш контейнер из файловой системы, которая вообще не поддерживает xattr?
@NateEldredge Вы правы, это зависит от файловой системы, я предполагаю, что файловая система будет поддерживать расширенные атрибуты, поскольку это одно из требований.
Если у вас есть доступ к самим файлам Dockerfile, вы можете внести изменения в файл Dockerfile, чтобы изменить расширенные атрибуты и обеспечить успешное завершение сборки. Чтобы обеспечить совместимость нескольких архитектур для одного образа Docker, вы можете использовать следующую методологию:
По мере необходимости обрабатывайте расширенные атрибуты в каждом файле Dockerfile по-разному.
docker build -t my-image:amd64 .
docker push my-image:amd64
docker build -t my-image:arm64 .
docker push my-image:arm64
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 или сборке?
Правильный; если у вас нет доступа к файлам докеров или сборке, что у вас есть доступ к изменению? Можете ли вы подробнее описать ваш рабочий процесс?
Что ж, я попытался построить поверх данного образа докера, затем добавить свои расширенные атрибуты и попробовал ваш ответ, который решил проблему. Спасибо!
Пожалуйста, рад, что все сработало так, как ожидалось!
Chattr(1) работает не так, как вы ожидаете? Практически никогда не следует использовать
docker commit
. Можете ли вы привести более конкретный пример изменения, которое вы пытаетесь внести: с какого базового образа вы начинаете, какой атрибут вы пытаетесь изменить (и почему) и с какими проблемами вы сталкиваетесь?