无法在 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中创建