在过去的几天里,我一直在尝试让docker容器在Gentoo Hardened上正确运行。
我花了几天时间才发现的第一个问题是我自己的偏执:我放置Docker root的分区是用nosuid和noexec挂载的。因此,devicemapper驱动程序在它上面工作,因为它创建了许多循环设备来做它的事情,但覆盖驱动程序没有,因为它从顶部继承了noexec标志,所以容器内的可执行文件将不会运行。我就把这段知识留给别人去发现吧…
然而,在解决了这个问题后,我被另一个问题绊倒了: PaX标志。
PaX要求需要创建包含代码的新内存页的可执行文件标记有特殊的ELF头或扩展的文件系统属性,最好是两者都有,因为Gentoo的推荐设置是使用扩展属性并忽略ELF头。不符合的可执行文件在尝试的那一刻就会被杀死。
不幸的是,必须尝试的程序列表包括nodejs、python和几乎所有其他现代解释器,更不用说mongodb了。可能还有其他有问题的可执行文件,但这些是主要的罪魁祸首,也是您经常希望在容器中看到的东西。
更不幸的是,尽管docker镜像应该能够包含由扩展属性标记的文件,但需要这些标志的通用软件的官方镜像--特别是mongodb和nodejs --似乎都没有这些标志。
目前,我一直在通过在磁盘上定位实际文件并从容器外部设置它的xattr来解决这个问题。这显然是一个非常糟糕的主意。
解决这个问题的正确方法是什么,就这一点而言,是否有其他人似乎没有这个问题的特殊原因,正如大量的谷歌搜索所表明的那样?也许,有没有我错过的另一个内核选项(我倾向于经常这样做),或者是一个特定的推荐方法来设置它们,使其保持安全并实际工作?除了关闭PaX,也就是说。
发布于 2016-08-17 02:13:53
我也一直在为此而苦苦挣扎。有了您出色的解释作为灵感,我能够在有问题的docker容器中设置扩展属性。
在容器中运行的基本命令是:
setfattr -n user.pax.flags -v "emr" /container's/path/to/binary请注意,停靠容器本身需要安装attr包。如果您自己构建容器,则可以将上述命令作为RUN命令安装和运行。下面是一个扩展python官方镜像的示例:
FROM python:3-slim
RUN apt-get update && apt-get install -y attr
RUN setfattr -n user.pax.flags -v "emr" /usr/local/bin/python3.5
RUN setfattr -n user.pax.flags -v "emr" /usr/local/bin/pip如果没有,您可以使用docker exec container_name /bin/bash进入运行容器,并手动执行上述命令。
https://stackoverflow.com/questions/35591704
复制相似问题