无法在Dockerfile中运行sysctl命令。

25

我正在尝试制作我的第一个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"]

你需要在构建镜像时使用它还是在镜像运行时使用? - rustyx
当图像运行时 - neorus
你可以尝试使用 sysarch 方法。但是不要从 RUN 中执行,因为 RUN 是在构建时执行的。 - rustyx
3个回答

28

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

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

鉴于您在此Dockerfile中显示的内容-自定义的Linux内核设置,没有特定的应用程序正在运行,开放式的ssh守护程序作为容器进程-您可能需要考虑虚拟机是否更适合您的需求。 您可以使用像Packer这样的工具以可重复的方式构建VM映像,就像Dockerfile构建Docker映像一样。 由于VM具有隔离内核,因此您可以在其中运行该sysctl 命令,并且它将起作用,可能通过正常的全Linux安装方法,例如 /etc/sysctl.conf 文件。


您确定Docker容器共享主机系统的内核及其设置吗?我将net.core.somaxconn设置为65535,但在同一主机上创建的容器仍显示net.core.somaxconn为128。 - xiao su
1
“docker run”文档(我在我的答案中修复了链接)指出,“net.*” sysctl是有命名空间的,因此它们可以在每个容器上设置。 - David Maze

7

这是预期的,因为 Docker 限制对 /proc/sys 的访问(出于安全考虑)。基本上,为了实现你正在尝试的功能,你需要给用户赋予CAP_SYS_ADMIN权限或以特权模式运行,这些在build过程中都是不允许的,参见{issue}。

目前,如果你可以在容器启动后运行这些命令,那么你可以使用--cap-add=SYS_ADMIN--privileged标志。理想情况下,在生产系统中我们不会这样做,但你似乎正在实验室环境中运行。如果在run阶段执行,我建议首先尝试使用--sysctl标志,但它只支持部分命令,而且我不确定它是否允许你修改内核设置。


是的,这是一个实验室设置(试图创建一个设置,学生可以通过ssh连接并执行“返回到libc”攻击)。在构建docker镜像时需要添加那些标志吗?(docker build .... --privileged?) - neorus
@neorus 很遗憾,docker build 添加特权类型支持的 Github 问题仍然是开放状态(已经开放了6年)- 您可以在 issues/1916 上跟进。 - Debosmit Ray
问题已经关闭。但是正如 @David Maze 所提到的,net.* sysctl 只能在容器基础上使用,而不能用于镜像。 - schlumpfpirat

0

使用以下命令来运行您的容器:

docker run --rm -it --privileged myapp:1.0 /bin/bash

然后,您将能够毫无问题地执行您的Dockerfile。

如果您这样做,请理解它会给容器提供所有功能并解除cgroup控制器强制执行的限制。最好遵循最小权限原则,并使用--cap-add仅提供所需的功能。另请参见https://dev59.com/ZVoV5IYBdhLWcg3wTdQc#36441605。 - bishop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接