无法在 Dockerfile 中运行 sysctl 命令

neo*_*rus 11 sysctl docker

我正在尝试制作我的第一个 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"]
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 15

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

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

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


Deb*_*Ray 5

这是预期的,因为 docker 限制访问/proc/sys(为了安全)。从根本上说,为了实现您正在尝试的功能,您需要为用户提供CAP_SYS_ADMIN或以特权模式运行,这两者都不允许在 期间build,请参阅{问题}。

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