Как подделать архитектуру процессора в контейнере докеров?

Когда я создаю 32-битный образ докера CentOS 5, я бы хотел, чтобы архитектура процессора сообщалась там как i386/i686 (установщик, который тестировал архитектуру проверки этого контейнера и устанавливает 64-битные двоичные файлы вместо 32-битных). Я установил переменные yum и создал оболочку uname, поэтому yum и проверки в скриптах bash работают:

bash-3.2# uname -a
Linux c538cf9bf508 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014 i686 i686 i386 GNU/Linux
bash-3.2# uname -p -m -i
i686 i686 i386
bash-3.2# cat /etc/yum/vars/arch && cat /etc/yum/vars/basearch
i686
i386

Но python по-прежнему сообщает о 64-битной версии.

bash-3.2# python
Python 2.4.3 (#1, Jan  9 2013, 06:49:54) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-54)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, platform
>>> platform.machine()
'x86_64'
>>> os.uname()
('Linux', 'c538cf9bf508', '3.13.0-24-generic', '#47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014', 'x86_64')

Есть ли способ везде подделать архитектуру процессора?


person ISanych    schedule 21.10.2014    source источник


Ответы (3)


Я надеюсь, что есть более элегантный способ сделать это, но вот что я делаю: предваряйте любую команду, которую вы хотите запустить, linux32. Например:

$ docker run -t -i toopher/centos-i386:centos6 /bin/bash
[root@b027ad7830ac /]# uname -a
Linux b027ad7830ac 3.16.4-tinycore64 #1 SMP Thu Oct 23 16:14:24 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@b027ad7830ac /]# linux32 uname -a
Linux b027ad7830ac 3.16.4-tinycore64 #1 SMP Thu Oct 23 16:14:24 UTC 2014 i686 i686 i386 GNU/Linux
[root@b027ad7830ac /]# linux32 python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:37:14) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, platform
>>> platform.machine()
'i686'
>>> os.uname()
('Linux', 'b027ad7830ac', '3.16.4-tinycore64', '#1 SMP Thu Oct 23 16:14:24 UTC 2014', 'i686')

В качестве альтернативы вы можете использовать linux32 при вызове docker run:

$ docker run -t -i toopher/centos-i386:centos6 /usr/bin/linux32 /bin/bash
[root@0f289d955fe1 /]# uname -a
Linux 0f289d955fe1 3.16.4-tinycore64 #1 SMP Thu Oct 23 16:14:24 UTC 2014 i686 i686 i386 GNU/Linux
[root@0f289d955fe1 /]# python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:37:14) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, platform
>>> platform.machine()
'i686'
>>> os.uname()
('Linux', '0f289d955fe1', '3.16.4-tinycore64', '#1 SMP Thu Oct 23 16:14:24 UTC 2014', 'i686')

Или, что еще лучше, используйте образ докера (или создайте свой собственный), который настраивает linux32 как ENTRYPOINT, например:

FROM toopher/centos-i386:centos6
ENTRYPOINT ["linux32"]
person Evan Grim    schedule 04.11.2014
comment
Я пытался использовать его раньше, но нашел только 64-битный пакет, теперь я нашел его в наборе пакетов, и он работает нормально, спасибо. Я устанавливаю его как точку входа, и это должно решить мою проблему. - person ISanych; 04.11.2014
comment
Отличный момент - я обновил ответ, включив в него предложение ENTRYPOINT. - person Evan Grim; 04.11.2014
comment
Просто примечание: я отправил запрос toopher/centos-i386:centos6, так что теперь он отлично работает из коробки: github.com/toopher/toopher-docker/pull/1 - person Vlad Frolov; 01.12.2015

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

RUN rm /bin/sh && \
  echo -e '#!/bin/bash\n/usr/bin/linux32 -- /bin/bash "$@"' > /bin/sh && \
  chmod +x /bin/sh

/bin/sh обычно является символической ссылкой на /bin/bash. Это заменяет символическую ссылку следующим скриптом:

#!/bin/bash
/usr/bin/linux32 -- /bin/bash "$@"

Что заставляет каждый вызов RUN в вашем Dockerfile выполняться под linux32. Если вы не используете формат RUN ["command"...], который обходит вызов /bin/sh. В этом случае вам придется добавить префикс linux32 вручную.

person jcoffland    schedule 20.10.2015

Для CentOS вам нужно только изменить следующие файлы:

+RUN echo "i686" > /etc/yum/vars/arch && \
+    echo "i386" > /etc/yum/vars/basearch

(так же, как я сделал в pull-request to toopher/centos-i386:centos6)

$ docker run -it --rm toopher/centos-i386:centos6 sh
sh-4.1# python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:37:14)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.uname()
('Linux', 'dc8d1dc46702', '3.16.0-4-amd64', '#1 SMP Debian 3.16.7-ckt11-1+deb8u6 (2015-11-09)', 'i686')
person Vlad Frolov    schedule 01.12.2015
comment
Это круто! Спасибо. - person Nishant; 23.11.2020