在过去的几天里,我一直在试图让 docker 容器在 Gentoo Hardened 上正确运行。
我花了几天时间才发现的第一个问题是由我自己的偏执引起的:我放置 Docker 根目录的分区是用 nosuid 和 noexec 挂载的。结果,devicemapper 驱动程序对其进行了处理,因为它创建了许多循环设备来执行它的操作,但覆盖驱动程序没有,因为它从顶部继承了 noexec 标志,因此容器内的任何可执行文件都不会运行。我将把这些知识留给人们在这里发现......
然而,在解决这个问题后,我又遇到了另一个问题:PaX 标志。
PaX 强制要求创建包含代码的新内存页面的可执行文件使用特殊的 ELF 标头或扩展文件系统属性进行标记,最好两者都标记,因为 Gentoo 的推荐设置是使用扩展属性并忽略 ELF 标头。不符合要求的可执行文件在尝试的那一刻就会被杀死。
不幸的是,必须尝试的程序列表包括 nodejs、python 和几乎所有其他现代解释器,更不用说 mongodb。可能还有其他问题可执行文件,但这些是罪魁祸首,也是您经常希望在容器中看到的东西。
更不幸的是,即使 docker 映像应该能够包含由扩展属性标记的文件,但需要此类标志的通用软件的官方映像(尤其是 mongodb 和 nodejs)似乎都没有这些。
目前,我一直在通过在磁盘上找到实际文件并从容器外部设置它的 xattr 来解决这个问题。这显然是一个非常糟糕的主意。
解决这个问题的正确方法是什么?就此而言,是否有其他人似乎没有这个问题的特殊原因,正如大量谷歌搜索所表明的那样?是否有我错过的另一个内核选项(我经常这样做)或设置它们的特定推荐方法,以便它保持安全并实际工作?除了关闭 PaX,就是这样。