无法在Dockerfile中运行sysctl命令

时间:2019-02-23 19:03:22

标签: docker sysctl

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

  

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"]

2 个答案:

答案 0 :(得分:3)

这是预料之中的,因为docker限制了对/proc/sys的访问(出于安全性考虑)。从根本上讲,为了实现您要尝试的功能,您需要为用户提供CAP_SYS_ADMIN或以特权模式运行,而特权模式在build期间均不允许,请参见{issue}。

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

答案 1 :(得分:1)

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

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

鉴于您在此Dockerfile中显示的内容-自定义的Linux内核设置,没有运行特定的应用程序,无限制的ssh守护程序作为容器进程-您可能会考虑虚拟机是否更适合您的需求。您可以使用Packer之类的工具以可重复的方式生成VM映像,就像Dockerfile生成Docker映像一样。由于VM 确实有隔离内核,因此您可以在此处运行sysctl命令,并且可以运行此命令,也许可以通过常规的完整Linux安装方法(例如/etc/sysctl.conf文件)运行。