Docker-compose:挂载tmpfs可供非root用户使用

11
我正在创建Docker镜像,稍后将在Kubernetes上使用并进行严格的设置:
1. 只读文件系统 2. 非root用户
为了测试目的,我可以在docker-compose配置中使用`read_only: true`来模拟1)。然后,我必须添加一些目录以进行写入活动,例如/run和/var。但是,如果我尝试像这里所示使用tmpfs,则该目录的所有者是root:
drwxr-xr-x 2 root root 40 Nov 27 11:05 /var

有没有秘密选项可以让它变成drwxrwxrwx?除了普通的磁盘目录外,还有其他替代方案吗?

正在运行:

  • Docker版本为18.06.0-ce
  • docker-compose版本为1.8.0
  • Ubuntu 16.04
2个回答

17

您可以指定tmpfs的模式:

docker run -d \
  -it \
  --name tmptest \
  --mount type=tmpfs,destination=/app,tmpfs-mode=1770 \
  nginx:latest

https://docs.docker.com/storage/tmpfs/#specify-tmpfs-options


使用旧的2.x compose文件语法,可以这样指定:

version: "2.4"
services:
  my_app:
    image: my_app
    read_only: true
    restart: always
    tmpfs:
      - /run:mode=770,size=1k,uid=200,gid=10000

https://github.com/docker/cli/issues/698#issuecomment-429688027


针对3.x语法,采用长格式卷定义,您需要遵循此问题:

https://github.com/docker/cli/issues/1285


@xenoid 我个人解决这类问题的方法通常是在容器内以 root 身份启动入口点,修复任何文件权限和 uid,然后执行 exec gosu 从 root 切换到用户。容器现在有效地作为该用户运行,但并不是每个安全团队都接受这个选项。 - BMitch
我很不幸有这样一个安全团队 :) 但是由于我可以设置UID,所以我不需要修复访问权限。 - xenoid
1
情节反转:今天早上,我在 Dockerfile 中删除了 RUN chown ... 后,mode= 起作用了。 - xenoid
1
截至2022年,tmpfs模式“默认为1777或全局可写”,但我仍然遇到EACCESS错误,因此我认为问题可能比这更复杂。 - Jason
1
可能是个bug吗?我遇到了类似的问题,即使明确设置了“mode”,挂载点也是755。 - Derkades
显示剩余2条评论

4
这适用于当前的主分支规范:
services:
  my_app:
    image: my_app
    volumes:
      - type: tmpfs
        target: /app/tmp
        tmpfs:
          mode: 01777

首位的0是有意义的,请勿删除。

确保目录事先不存在,否则会忽略权限。在您的Dockerfile中进行操作:

RUN rm -rf /app/tmp

不要关心 `uid` 或 `gid`:截至2023年5月,它们尚未实现。当前源代码链接:https://github.com/moby/moby/blob/master/api/types/mount/mount.go#L103-L135 (permalink)

1
太棒了!你救了大家一命!可惜这个东西实现得如此糟糕,而且没有文档记录 :( - Bertrand Bordage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接