私は最初の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を設定できますが、あなたが言及しているものはそうではありませんこれらの1つではありません。
さらに、Dockerfileでこのような変更を強制することもできません。 Dockerイメージには、ファイルシステムといくつかの関連メタデータのみが含まれ、実行中のプロセスやホストシステムの設定は含まれません。これがRUN sysctl
で機能したとしても、システムを再起動してイメージからコンテナを起動すると、その設定は失われます。
このDockerfileで示した内容(カスタマイズされたLinuxカーネル設定、特定のアプリケーションが実行されていない、コンテナプロセスとしてのオープンエンドのsshデーモン)を考えると、仮想マシンがニーズに適しているかどうかを検討できます。 Packer のようなツールを使用して、DockerfileがDockerイメージを構築するのとほぼ同じ方法でVMイメージを再現可能に構築できます。VMdoes分離されたカーネルがあり、そこでsysctl
コマンドを実行すると、通常のフルLinuxを介して機能します-/etc/sysctl.conf
ファイルのようなインストール方法。
Dockerは/proc
および/sys
(セキュリティのため)へのアクセスを制限しているため、これは予期された動作です。基本的に、試行していることを達成するには、ユーザーにCAP_SYS_ADMIN
を与えるか、特権モードで実行する必要があります。どちらもbuild
の間は許可されていません。{ issue }。
現在、コンテナの実行後にこれらを実行できる場合は、--cap-add=SYS_ADMIN
または--privileged
フラグを使用できます。理想的には、これらは本番システムで実行することではありませんが、ラボのセットアップで実行しているようです。 run
の段階でそれを行う場合は、最初に--sysctl
フラグを試すことをお勧めしますが、これはコマンドのサブセットのみをサポートするため、カーネル設定を変更できるかどうかはわかりません。