web-dev-qa-db-ja.com

Dockerfileでsysctlコマンドを実行できません

私は最初の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"]
3
neorus

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ファイルのようなインストール方法。

5
David Maze

Dockerは/procおよび/sys(セキュリティのため)へのアクセスを制限しているため、これは予期された動作です。基本的に、試行していることを達成するには、ユーザーにCAP_SYS_ADMINを与えるか、特権モードで実行する必要があります。どちらもbuildの間は許可されていません。{ issue }。

現在、コンテナの実行後にこれらを実行できる場合は、--cap-add=SYS_ADMINまたは--privilegedフラグを使用できます。理想的には、これらは本番システムで実行することではありませんが、ラボのセットアップで実行しているようです。 runの段階でそれを行う場合は、最初に--sysctlフラグを試すことをお勧めしますが、これはコマンドのサブセットのみをサポートするため、カーネル設定を変更できるかどうかはわかりません。

4
Debosmit Ray