簡體   English   中英

無法在 Dockerfile 中運行 sysctl 命令

[英]Cannot run sysctl command in Dockerfile

我正在嘗試制作我的第一個 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"]

由於 Docker 容器共享主機系統的內核及其設置,因此 Docker 容器通常根本無法運行sysctl (您尤其不能像這樣禁用安全關鍵設置。)您可以使用docker run --sysctl在容器本地基礎上設置有限數量的 sysctl,但您提到的不是其中之一。

此外,您也不能在 Dockerfile 中強制進行這樣的更改。 一個 Docker 鏡像只包含一個文件系統和一些相關的元數據,而不包含任何正在運行的進程或主機系統設置。 即使此RUN sysctl有效,如果您重新啟動系統然后從映像啟動容器,該設置也會丟失。

鑒於您在此 Dockerfile 中顯示的內容——定制的 Linux 內核設置、沒有運行特定的應用程序、作為容器進程的開放式 ssh 守護進程——您可能會考慮虛擬機是否更適合您的需求。 您可以使用Packer 之類的工具以與 Dockerfile 構建 Docker 鏡像大致相同的方式可重現地構建 VM 鏡像。 由於虛擬機確實有一個獨立的內核,你可以在那里運行那個sysctl命令,它會工作,也許通過像/etc/sysctl.conf文件這樣的正常的完整 Linux 安裝方法。

這是意料之中的,因為 docker 限制對/proc/sys訪問(為了安全)。 從根本上說,為了實現您正在嘗試的功能,您需要為用戶提供CAP_SYS_ADMIN或以特權模式運行,這在build期間均不允許,請參閱 { issue }。

目前,如果您可以在容器運行后運行這些東西,那么您可以使用--cap-add=SYS_ADMIN--privileged標志。 理想情況下,這些不是我們會在生產系統中做的事情,但您似乎在實驗室設置中運行。 如果在run階段執行此操作,我建議首先嘗試--sysctl標志,但這僅支持命令的一個子集,我不確定它是否能讓您修改內核設置。

使用以下命令運行您的容器: docker run --rm -it --privileged myapp:1.0 /bin/bash 然后您將能夠毫無問題地執行您的 Dockerfile

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM