docker - 如何使容器根文件系统 r/o 但允许写入 WORKDIR
问题描述
我想根据这个答案将根文件系统设为只读:
docker run --read-only ... myapp
但是,我还需要允许在容器中运行的应用程序访问其文件夹/app
。该应用程序需要一些临时存储空间,但为了安全起见,我需要限制它对所有内容的访问。
解决方案
您使用选项挂载到容器中的任何内容docker run -v
都不是“根文件系统的一部分”,并且可以拥有自己的访问模式。如果您只需要容器内的一些暂存空间,您可以使用该docker run --tmpfs
选项在某处挂载一个空的内存文件系统。
$ docker run --rm --read-only busybox \
> sh -c 'touch /tmp/foo && ls /tmp'
touch: /tmp/foo: Read-only file system
$ docker run --rm --read-only --tmpfs /tmp busybox \
> sh -c 'touch /tmp/foo && ls /tmp'
foo
您可以对命名卷执行相同的操作:
$ docker volume create vol
vol
$ docker run --rm --read-only -v vol:/tmp busybox touch /tmp/foo
$ docker run --rm --read-only -v vol:/tmp busybox ls /tmp
foo
您不想对包含应用程序源代码的目录执行此操作。出于安全原因,如果您足够担心将根文件系统设置为只读,那么您不想冒应用程序代码被覆盖的风险。如果您的应用程序代码确实出现在一个卷中,Docker 会将其视为有价值的用户数据并拒绝对其进行更新。所以选择除此之外的一些目录(只要可以开始为空,/app
子目录就可以正常工作)。/app/data
推荐阅读
- php - 如何将 PHP 值发送回 HTML 表单?
- powershell-2.0 - 当Powershell 2中的文件夹达到一定大小时重命名文件夹+删除超过一定大小的任何内容
- python - 以与输入相同的顺序返回列表的索引
- python - 命令“python setup.py egg_info”在 /tmp/pip-build-qgafa8x3/numba/ 中失败,错误代码为 1
- spring-boot - 保存新的父+子实体时“参数索引超出范围”(manyToOne)
- http - HTTP POST请求中的自定义内容类型?
- firebase - 使用 fastlane 和 Firebase App Distribution 分发 Flutter 应用
- mongodb - Mongodb - 索引使用和应用
- python - 用于测试 Postgres 连接并获取响应代码的 Python 代码
- android - 颤振错误:没有为“对象”类型定义方法“数据”