如何在docker容器中伪造cpu架构?

ISa*_*ych 9 centos5 centos docker

当我创建32位CentOS 5 docker镜像时,我希望将cpu架构报告为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
Run Code Online (Sandbox Code Playgroud)

但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')
Run Code Online (Sandbox Code Playgroud)

有没有办法到处伪造cpu架构?

Eva*_*rim 5

我希望有一种更优雅的方法来执行此操作,但是我要做的是:在您要运行的任何命令前添加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')
Run Code Online (Sandbox Code Playgroud)

另外,您也可以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')
Run Code Online (Sandbox Code Playgroud)

甚至更好的是,使用配置linux32为的docker映像(或构建自己的映像)ENTRYPOINT,例如:

FROM toopher/centos-i386:centos6
ENTRYPOINT ["linux32"]
Run Code Online (Sandbox Code Playgroud)

  • 我以前尝试使用它,但是只找到了64位软件包,现在我在setarch软件包中找到了它,并且工作正常,谢谢。我将其设置为入口点,它应该可以解决我的问题。 (2认同)