在浏览 docker 文档时,我遇到了 docker run 命令的volumes-from (https://docs.docker.com/engine/reference/commandline/run/)选项。 我不明白提供的
ro, rw, and z
选项之间的区别-$ docker run --volumes-from ba8c0c54f0f2:ro -i -t ubuntu pwd
ro
选项被替换为z
。如果有人探索使用这些选项的差异,我将不胜感激。
卷挂载可以添加两个后缀
:z
或 :Z
。这些后缀告诉 Docker 重新标记共享卷上的文件对象。 z
选项告诉 Docker 卷内容将在容器之间共享。 Docker 将使用共享内容标签来标记内容。共享卷标签允许所有容器读取/写入内容。 Z
选项告诉 Docker 使用私有非共享标签来标记内容。
如果您使用selinux,您可以添加
z
或 Z
选项来修改要挂载到容器中的主机文件或目录的selinux 标签。这会影响主机本身上的文件或目录,并可能在 Docker 范围之外产生影响。
z
选项表示绑定挂载内容在多个容器之间共享。Z
选项表示绑定挂载内容是私有且不共享的。
使用这些选项时要格外小心。使用 /home
选项绑定安装系统目录(例如 /usr
或 Z
)会使您的主机无法操作,您可能需要手动重新标记主机文件。
$ docker run -d \
-it \
--name devtest \
-v "$(pwd)"/target:/app:z \
nginx:latest
https://docs.docker.com/storage/bind-mounts/#configure-bind-propagation
根据我机器上的测试,
-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
可以使用 --volumes-from 标志从其他容器访问 testing-z 中的 /var/www/html 的内容,如下所示:
$ docker run --rm --volumes-from testing-z -it nginx sh
# cat /var/www/html/index.html
foo
观察:我正在运行 Docker 版本 19.03.5-ce,内部版本 633a0ea838
docker run --volumes-from a64f10cd5f0e:z -i -t rhel6 bin/bash
我已经测试过它,我已安装在一个容器中,然后从该容器安装到另一个新容器中。 IT 与 rw 选项一起使用
我做了以下观察:
# 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