Docker,将卷挂载为只读


106

我正在使用Docker,并且我想安装一个动态文件夹,该文件夹会发生很大变化(因此我不必为每次执行都制作一个Docker映像,这会太昂贵),但是我希望该文件夹为只读。将文件夹所有者更改为其他人可行。但是,chown需要root访问权限,而我不希望将其公开给应用程序。

当我使用-vflag进行挂载时,它将提供我提供的任何用户名,我在docker映像内创建了一个非root用户,但是,该卷中的所有文件都以运行docker的用户作为所有者,更改为我从命令行给,所以我不能制作只读文件和文件夹。我该如何预防?

我还添加了mustafa ALL=(docker) NOPASSWD: /usr/bin/docker,因此我可以通过终端更改为另一个用户,但是文件仍然具有我的用户的权限。


只是以为我会在这里发表评论,说使用户能够运行docker容器与给他完全root访问一样。这也记录在Docker文档的安全性部分中。
Blackclaws

Answers:


170

您可以通过附加:ro-v开关来指定卷应为只读:

docker run -v volume-name:/path/in/container:ro my/image

请注意,该文件夹在容器中是只读的,在主机上是可读写的。

2018编辑

根据“ 使用卷”文档,现在存在另一种通过使用--mount交换机挂载卷的方法。这是通过只读方式使用的方法:

$ docker run --mount source=volume-name,destination=/path/in/container,readonly my/image

码头工人组成

这是一个如何在中指定只读容器的示例docker-compose

version: "3"
services:
  redis:
    image: redis:alpine
    read_only: true

8
是否有允许写但没有写回主机的信息?那真是太棒了
Ray Foss

9
听起来您好像根本不想指定任何音量。
阿尔卑斯山

1
有点...我只是不喜欢只为了使用Dockerfile COPY或docker cp在关闭的容器上使用单独的命令而构建映像。
雷·福斯

5
也许您可以为此提供一个新问题,在这里提供更多详细信息并在此处链接?
阿尔卑斯

您还可以将redis:alpine:ro
短语法

23

码头工人组成

这是在中指定只读卷的正确方法docker-compose

version: "3.2" # Use version 3.2 or above
services:
  my_service:
    image: my:image
    volumes:
      - type: volume
        source: volume-name
        target: /path/in/container
        read_only: true
volumes:
  volume-name:

https://docs.docker.com/compose/compose-file/#long-syntax-3


2
确实是正确的,但是这里的只读是卷,而不是容器。
КонстантинВан

这仅对我version: "3.2"
有用

“以版本3.2文件格式添加。” 是的
rybo111

3
您也可以- './my-file.txt:/container-readonly-file.txt:ro'在下面进行操作volumes-请注意:ro最后。
rybo111
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.