什么是docker container's volume-from选项中的'z'标志?

时间:2016-02-05 07:06:41

标签: docker

在浏览docker文档时,我遇到了来自(https://docs.docker.com/engine/reference/commandline/run/)的docker run命令选项。 我不明白提供的ro, rw, and z选项之间的差异.-  $ docker run --volumes-from ba8c0c54f0f2:ro -i -t ubuntu pwd
在上面的命令中,ro选项被z替换。如果有人探讨使用这些选项的不同之处,我将感激不尽。

4 个答案:

答案 0 :(得分:34)

两个后缀:z或:Z可以添加到卷装入。这些后缀告诉Docker重新标记共享卷上的文件对象。 ' z'选项告诉Docker卷内容将在容器之间共享。 Docker将使用共享内容标签标记内容。共享卷标签允许所有容器读/写内容。 ' Z'选项告诉Docker使用私有非共享标签标记内容。

https://github.com/rhatdan/docker/blob/e6473011583967df4aa5a62f173fb421cae2bb1e/docs/sources/reference/commandline/cli.md

如果使用selinux,则可以添加z或Z选项以修改要装入容器的主机文件或目录的selinux标签。这会影响主机本身的文件或目录,并且可能会产生Docker范围之外的后果。

z选项表示绑定装载内容在多个容器之间共享。 Z选项表示绑定装载内容是私有且非共享的。 请谨慎使用这些选项。使用Z选项绑定安装系统目录(例如/ home或/ usr)会导致主机无法运行,您可能需要手动重新标记主机文件。

$ docker run -d \    - \   --name devtest \   -v" $(pwd)" / target:/ app:z \   nginx的:最新

https://docs.docker.com/storage/bind-mounts/#configure-bind-propagation

答案 1 :(得分:2)

从我机器上的测试中,-z使您可以与另一个容器共享内容。假设这张图片:

FROM alpine
RUN mkdir -p /var/www/html \
    && echo "foo" > /var/www/html/index.html

让我们构建它并标记为 test-z

$ docker build . -t test-z

现在创建并运行名为 testing-z test-z 容器,将卷 test-vol 映射到 / var / www / html 并添加 z 修饰符

$ docker run \
    --name testing-z \
    --volume test-vol:/var/www/html:z \
    -d test-z tail -f /dev/null

testing-z / var / www / html 的内容可以使用-volumes-from 从其他容器访问>标志,如下所示:

$ docker run --rm --volumes-from testing-z -it nginx sh
# cat /var/www/html/index.html
foo

不好。:我正在运行Docker 19.03.5-ce版本,版本633a0ea838

答案 2 :(得分:2)

我做了以下观察:

# docker run --rm -ti -v /host/path/to/flyway/scripts:/flyway/sql:z --entrypoint '' flyway/flyway ls -l /flyway/sql
total 0

# docker run --rm -ti -v /host/path/to/flyway/scripts:/flyway/sql --entrypoint '' flyway/flyway ls -l /flyway/sql
ls: cannot open directory '/flyway/sql': Permission denied

因此,在这种情况下,只有设置:z时容器才能工作。在此主机上,安装了SELinux。如果不是这种情况,:z对我来说就没有明显的作用。

除了:z之外,还可以在主机文件夹上使用chcon来更改此权限:

# chcon -t svirt_sandbox_file_t /host/path/to/flyway/scripts

# docker run --rm -ti -v /host/path/to/flyway/scripts:/flyway/sql:z --entrypoint '' flyway/flyway ls -l /flyway/sql
total 0

# docker run --rm -ti -v /host/path/to/flyway/scripts:/flyway/sql --entrypoint '' flyway/flyway ls -l /flyway/sql
total 0

答案 3 :(得分:1)

docker run --volumes-from a64f10cd5f0e:z -i -t rhel6 bin/bash

我测试了它,我已经安装在一个容器中,从那个容器安装到另一个新容器中。 IT配备rw选项