我可以信任 Ubuntu 14.04 主机中 redhat6.4 的 docker 容器中的 c/c++ 源代码构建吗?或我需要考虑的任何限制?
我们正在尝试使用 docker 服务于不同的 OS 平台来编译源代码,因为 docker 中的技术是共享主机 os 的内核,请参阅相关问题docker 主机 OS 和容器基础映像 OS 之间的关系是什么?
3.13.0-24-generic2.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
Run Code Online (Sandbox Code Playgroud)
这是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
Run Code Online (Sandbox Code Playgroud)
c/c++ 代码有什么例外吗?
在正常情况下,本机编译的代码(C、C++...)也不例外。
正如您所写,程序与 而libc不是内核进行交互,除非是非常特殊的情况。
这个libc库不会在你的 Ubuntu 主机和你的 Redhat 容器之间共享。你的容器有自己的libc抽象系统调用到内核。
关于内核本身,请注意,即使 Linux 内核内部结构趋向于移动,总是不断发展代码片段,公开公开的内容(用户空间应用程序可访问的 ABI 和libc)在版本之间保持稳定和兼容。在极少数情况下,大多数情况下,这种兼容性已被破坏,并非有意为之。(见这篇文章)。
所以,是的,使用 RHEL 开发人员是完全安全的。Ubuntu 主机上的环境,并信任从此容器生成的构建。