Я могу придумать два способа изменить product_uuid
, если я правильно понимаю ваш вопрос.
Монтирование над product_uuid
Вы можете привязать файл с хоста к этому пути в контейнере. Поэтому вместо вызова sysfs при чтении этого пути он будет читать смонтированный файл.
Например:
$ echo "new-uuid" > /var/tmp/product_uuid
$ docker run --rm -ti -v /var/tmp/product_uuid:/sys/class/dmi/id/product_uuid centos bash
[root@217e12a74e74 /]# cat /sys/class/dmi/id/product_uuid
new-uuid
chroot внутри изображения
Если вы не хотите монтировать в файл и хотите, чтобы это полностью содержалось в контейнере, другой способ сделать это - использовать chroot при построении изображения.
Ниже приведен пример Dockerfile, который устанавливает оболочку внутри chroot
:
FROM centos:7
RUN mkdir -p /chroot /chroot/sys/class/dmi/id \
&& cp -al /lib /lib64/ /usr/ chroot/ || echo "Ignoring linking issues ..." \
&& echo "new-uuid" > /chroot/sys/class/dmi/id/product_uuid
CMD chroot /chroot sh
Когда мы запускаем это, он запускает оболочку по умолчанию внутри нашего chroot:
$ docker run -ti --rm uuid-test
sh-4.2# cat /sys/class/dmi/id/product_uuid
new-uuid
Для вашего случая использования вам также нужно добавить ваше приложение и его зависимости в chroot
, а также заменить sh
на команду запуска приложений. Также обратите внимание, что это означает, что /sys/
будет содержать только файл /sys/class/dmi/id/product_uuid
.
Другие способы?
Сверх того, я не уверен в каком-либо другом простом способе сделать это, так как docker всегда будет монтировать sysfs в /sys
- если вы не укажете /sys
как VOLUME в Dockerfile, но я не думаю, что помогите здесь.