首页 > 解决方案 > 如何使容器根文件系统 r/o 但允许写入 WORKDIR

问题描述

我想根据这个答案将根文件系统设为只读:

docker run --read-only ... myapp

但是,我还需要允许在容器中运行的应用程序访问其文件夹/app。该应用程序需要一些临时存储空间,但为了安全起见,我需要限制它对所有内容的访问。

标签: dockerdocker-compose

解决方案


您使用选项挂载到容器中的任何内容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


推荐阅读