无法在 Dockerfile 中运行 sysctl 命令

Posted

技术标签:

【中文标题】无法在 Dockerfile 中运行 sysctl 命令【英文标题】:Cannot run sysctl command in Dockerfile 【发布时间】:2019-07-17 14:39:52 【问题描述】:

我正在尝试制作我的第一个 dockerfile(我是新手),我需要系统运行命令 sysctl -w kernel.randomize_va_space=0(它是一个实验室环境。),但我得到了错误:

sysctl:设置键“kernel.randomize_va_space”:只读文件 系统

每当我尝试构建 dockerfile 时,有什么建议可以解决这个问题吗?

FROM avatao/lesp:ubuntu-14.04

USER root

COPY ./solvable/ /

RUN sysctl -w kernel.randomize_va_space=0

VOLUME ["/tmp"]

EXPOSE 2222

WORKDIR /home/user/

USER user

CMD ["/usr/sbin/sshd", "-Df", "/etc/ssh/sshd_config_user"]

【问题讨论】:

在构建镜像的时候或者镜像运行的时候需要吗? 图像运行时 您可以尝试sysarch 方法。但不是从 RUN 开始,RUN 是在构建时执行的。 【参考方案1】:

由于 Docker 容器共享主机系统的内核及其设置,Docker 容器通常根本无法运行sysctl。 (您尤其不能禁用像这样的安全关键设置。)您可以使用 docker run --sysctl 在容器本地基础上设置有限数量的 sysctl,但您提到的不是其中之一。

此外,您也不能在 Dockerfile 中强制进行此类更改。一个 Docker 镜像只包含一个文件系统和一些相关的元数据,而不是任何正在运行的进程或主机系统设置。即使 RUN sysctl 有效,如果您重新启动系统然后从映像启动容器,该设置也会丢失。

鉴于您在此 Dockerfile 中展示的内容——定制的 Linux 内核设置、没有运行特定的应用程序、作为容器进程的开放式 ssh 守护进程——您可能会考虑虚拟机是否更适合您的需求。您可以使用像 Packer 这样的工具以与 Dockerfile 构建 Docker 镜像的方式大致相同的方式可重现地构建 VM 镜像。由于虚拟机确实有一个独立的内核,你可以在那里运行sysctl 命令,它可以工作,也许通过像/etc/sysctl.conf 文件这样的正常的完整Linux 安装方法。

【讨论】:

您确定 Docker 容器共享主机系统的内核及其设置吗?我在主机上将 net.core.somaxconn 设置为 65535,但是,在同一主机上创建的容器仍然显示 net.core.somaxconn 为 128。 docker run 文档(我在答案中修复了链接)指出 net.* sysctl 是命名空间的,因此可以基于每个容器进行设置。【参考方案2】:

这是意料之中的,因为 docker 限制了对 /proc/sys 的访问(出于安全考虑)。从根本上说,为了实现您的目标,您需要给用户CAP_SYS_ADMIN 或在特权模式下运行,build 期间都不允许,请参阅 issue。

目前,如果您可以在容器运行后让这些东西运行,那么您可以使用--cap-add=SYS_ADMIN--privileged 标志。理想情况下,我们不会在生产系统中执行这些操作,但您似乎在实验室设置中运行。如果在run 阶段执行此操作,我建议先尝试--sysctl 标志,但它仅支持命令子集,我不确定它是否允许您修改内核设置。

【讨论】:

是的,这是一个实验室设置(尝试进行设置,学生可以通过 ssh 连接并执行“返回 libc”攻击)。构建 docker 时是否需要添加这些标志? (docker build .... --privileged?) @neorus 不幸的是,向docker build 添加特权类型支持的 github 问题仍然开放(开放 6 年)-您可以在 issues/1916 中关注 问题已关闭。然而正如@David Maze 所提到的,net.* sysctls 只能用于容器,不能用于图像。

以上是关于无法在 Dockerfile 中运行 sysctl 命令的主要内容,如果未能解决你的问题,请参考以下文章

无法从 dockerfile 在后台运行 linux 命令?

从dockerfile构建的docker容器运行时无法连接到Rabbit MQ实例

无法在 Raspberry Pi 上从 Dockerfile 安装 dlib

无法运行rake db:使用docker-compose在Dockerfile中创建

在 iOS 上调用 sysctl 来获取后台进程列表是私人电话吗?

sysctl介绍