我可以信任在 Ubuntu 14.04 主机中为 redhat6.4 构建的 docker 容器中的 c/c++ 源代码吗?或者我需要考虑的任何限制?
我们正在尝试使用 docker 服务于不同的操作系统平台来编译源代码,因为 docker 中的技术是共享主机操作系统的内核,请参见相关问题 What is the relationship between the docker host OS and the container base image OS?
- 我的主机操作系统是 ubuntu 14.04(易于安装 docker),内核是
3.13.0-24-generic
- 我的应用平台是redhat 6.4(内核是
2.6.32-358.el6.x86_64
)
当我为 Ubuntu 的 RHEL 创建容器时,内核也更新为 3.13.0-24-generic
。
我的应用程序是基于 c/c++ 和 java 的。
我认为 java 对于编译的 .jar
文件不会有任何问题,因为它是基于 jvm 的。
而对于 c/c++ 代码,我的理解主要是它依赖于 libc
类共享库,而不依赖于内核,因此是否可以将编译后的代码用于真正的 redhat 环境。
此设置仅用于开发,不用于生产,生成的二进制文件应该安装在带有 RHEL 或 VM 的真实独立机器上。
那么我需要考虑什么吗?
可能是更多 lxc 相关的问题。
已更新以添加一些示例
我下载了gameoflife代码https://github.com/rvsjoen/game-of-life , 并在两个系统中编译,寻找这种情况,因为 md5 是相同的,结果是相同的并且是可信的。
这是VM中的redhat 6.4系统
[root@redhat game-of-life-master]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.4 (Santiago)
[root@redhat game-of-life-master]# uname -a
Linux redhat 2.6.32-358.el6.x86_64 #1 SMP Tue Jan 29 11:47:41 EST 2013 x86_64 x86_64x86_64 GNU/Linux
[root@redhat]# ldd gol
linux-vdso.so.1 => (0x00007fffaeaa8000)
libncurses.so.5 => /lib64/libncurses.so.5 (0x00000033fa000000)
libc.so.6 => /lib64/libc.so.6 (0x00000033f9c00000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00000033fb800000)
libdl.so.2 => /lib64/libdl.so.2 (0x00000033f9800000)
/lib64/ld-linux-x86-64.so.2 (0x00000033f9400000)
[root@redhat]# md5sum gol
4f3245d3d61b1c73e48537dd612d37c3 gol
这是docker容器中的redhat
bash-4.1# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.4 (Santiago)
bash-4.1# uname -a
Linux f51c7b4e80aa 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
bash-4.1# ldd gol
linux-vdso.so.1 => (0x00007fff5e3c2000)
libncurses.so.5 => /lib64/libncurses.so.5 (0x00007f2e84863000)
libc.so.6 => /lib64/libc.so.6 (0x00007f2e844d0000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f2e842ae000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f2e840aa000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2e84a8e000)
bash-4.1# md5sum gol
4f3245d3d61b1c73e48537dd612d37c3 gol
c/c++ 代码有什么异常(exception)吗?
最佳答案
在正常情况下,本地编译代码(C、C++...)也不异常(exception)。
如您所写,程序与 libc
交互,而不是内核,除非非常特殊的情况。
此 libc
库不会在您的 Ubuntu 主机和您的 Redhat 容器之间共享。您的容器有自己的 libc
,可将系统调用抽象到内核。
关于内核本身,请注意,即使 Linux 内核内部结构趋向于移动,总是不断演化代码片段,但公开公开的内容(ABI,用户空间应用程序和 libc
可访问)是在版本之间保持稳定和兼容。在极少数情况下,这种兼容性已被打破,大多数时候,不是故意的。 (参见 this article)。
所以,是的,使用 RHEL 开发人员是绝对安全的。 Ubuntu 主机上的环境,并信任从此容器生成的构建。
关于c++ - 在docker中编译不同内核的代码会受到什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23945109/