无法在 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
标志,但它只支持命令的一个子集,我不确定它是否会让你修改内核设置。
我正在尝试制作我的第一个 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
标志,但它只支持命令的一个子集,我不确定它是否会让你修改内核设置。