我正在尝试Docker 的userns-remap功能,以root用户身份在容器内创建一个文件,并test以主机上的用户身份拥有此文件的所有者。
我已将以下内容添加到 /etc/docker/daemon.json
{
"userns-remap": "test:test"
}
Run Code Online (Sandbox Code Playgroud)
重新映射似乎是根据守护程序日志进行的
User namespaces: ID ranges will be mapped to subuid/subgid ranges of: test:test
Run Code Online (Sandbox Code Playgroud)
和条目test:100000:65536,并test:100000:65536已被添加到/etc/subuid和/etc/subgid/分别文件。
但是当我启动一个容器并尝试在工作目录中创建文件时,它失败了
test@box:~$ docker run -v /home/test/tmp:/somedir -w /somedir -it ubuntu:16.04 /bin/bash
root@11ff6c42ffe1:/somedir# touch file.txt
touch: cannot touch 'file.txt': Permission denied
root@11ff6c42ffe1:/somedir# ls -l
total 0
-rw-rw-r-- 1 nobody nogroup 0 Mar 23 21:39 already_existing_file.txt
root@11ff6c42ffe1:/somedir# id root
uid=0(root) gid=0(root) groups=0(root)
root@11ff6c42ffe1:/somedir# touch /file.txt
Run Code Online (Sandbox Code Playgroud)
可以按预期在未从主机挂载的其他目录中创建文件。 …
假设我有一个保存一些数据的 Docker 容器。我希望这些数据能够持续存在 - 如果容器被停止、删除、升级等。我仍然希望数据位于主机操作系统文件系统上的可访问位置。
目前,我的解决方案是在我的主机上创建一个目录/srv/service-name(我使用 Ubuntu 14.10),然后使用参数运行我的服务-v /srv/service-name:/path/inside/container。
通过反复试验,我发现有时容器无法写入此内容,因为它没有正确的权限。我发现这个问题,其中仅提供数据容器作为解决方案。好吧,我不想使用容器,因为它对于我正在做的事情来说似乎不必要地复杂。我宁愿继续用-v.
那么,如何为正在挂载的目录设置正确的权限呢?