我正在尝试制作我的第一个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"]
答案 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
文件)运行。