无法在 Dockerfile 中 运行 sysctl 命令

Cannot run sysctl command in Dockerfile

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

sysctl: setting key "kernel.randomize_va_space": Read-only file system

每当我尝试构建 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"]

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

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

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

这是预期的,因为 docker 限制对 /proc/sys 的访问(出于安全考虑)。从根本上说,为了实现您正在尝试的目标,您需要在特权模式下为用户提供 CAP_SYS_ADMIN 或 运行,这在 build 期间均不允许,请参阅 {issue}.

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