読み取り専用ルートファイルシステム
- コンテナ上のファイルシステムへの書き込みを禁止する設定
- 起動中にファイル書き込みができないため、セキュリティレベルが結構上がる
- 多くの場合、一時ファイル、PID生成、ソケットファイル生成などの挙動があるため、単純に本機能を有効にしただけでは、書き込みエラーでプロセスが上がってこないので、この辺りは調べないといけない
どのように設定すればよいか
AWS側
タスク定義に下記を追記
{
readonlyRootFilesystem = true
}
アプリケーション側
- 書き込みが必要なディレクトリのみをDockerfileのVOLUMEでマウントする
- そうすると、ホストのファイルシステムへの書き込みができるようになる。
- また、このボリュームは揮発性であるため、コンテナ削除のタイミングでボリュームも削除される
例
FROM alpine:3.11.3
RUN mkdir -p /hoge /fuga
VOLUME ["/hoge"]
DockerfileのVOLUMEパラメータ
- これ実は使ったことがなかったので少し調べた
-
docker volume ls
で表示されるDocker volumeとは別物 - VOLUMEで指定したファイルシステムは他コンテナからマウントできる
- イメージ的には、Dockerで作るファイルサーバと思うと納得
- ローカルというか通常パッケージでインストールするDockerエンジンでは揮発性ではない(はず)
検証
上記のDockerfileをビルドし起動
docker run -it --name work volumetest sh
コンテナ内でテストファイルを作成
# touch /hoge/aaa /fuga/bbb
# ls -l /hoge/ /fuga/
/hoge/:
total 0
-rw-r--r-- 1 root root 0 Jan 13 01:57 aaa
/fuga/:
total 0
-rw-r--r-- 1 root root 0 Jan 13 01:57 bbb
# exit
別コンテナからVolumeをマウント
docker run --rm -it --volumes-from work alpine sh
/hogeにはファイルがあるが、/fugaにはないことが確認できる。
/ # ls /hoge
aaa
/ #
/ # ls /fuga
ls: /fuga: No such file or directory