我对这个问题感到沮丧有一段时间了,因为这里已经多次询问这个问题,例如在如何处理 Docker 中的持久存储(例如数据库)和什么是管理 Docker 共享卷的权限的(最佳)方法?,但答案根本没有解决问题。
第一个“答案”说只使用named volumes而不是传统的bind mounts. 这解决不了任何问题,因为当命名卷安装在主机上时,例如在默认位置/var/lib/docker/volumes/<volume name>/_data,那么该安装点将具有容器内安装点的uid/ 。gid
在 docker 命名卷之前给出的另一个“答案”是使用纯数据容器。这展示了同样的问题。
这对我来说是一个巨大的问题,因为我有很多嵌入式机器,我想在其中运行 docker 主机,并且用户在每台机器上可能有不同的uid/ 。gid因此,我无法在 Dockerfile 中对持久卷的挂载点硬编码uid/来实现匹配。gidid
这是问题的一个示例:假设我的用户foo位于主机上,具有uid 1001和gid 1001,并且将文件写入容器内的卷的用户具有uid 1002。当我运行容器时,docker将chown 1002:1002在主机上安装点目录,并用它写入文件uid,我什至无法用我的用户读取/写入文件foo。
视觉上(主机上的所有这些操作):
$ docker volume create --driver local --opt type=volume --opt device=/home/<my_host_user>/logs --opt o=bind logs
logs
$ docker volume inspect logs …Run Code Online (Sandbox Code Playgroud) permissions containers file-permissions docker docker-volume
我有一个对象,没有其他人Foo拥有Owner。我创建了一个Derived继承的类的对象Owner,将它传递unique_ptr给新创建的Foo. Derived有一个类的成员User也需要使用Foo,但不拥有它,所以它只得到一个指向它的原始指针。
#include <memory>
#include <iostream>
using namespace std;
struct Foo {
void talk() { cout << "foo" << endl; }
};
struct User {
Foo *foo;
User(Foo *_foo): foo(_foo) {};
void use() { foo->talk(); } //potential disaster if foo's memory has changed
};
struct Owner {
unique_ptr<Foo> foo;
Owner(unique_ptr<Foo> _foo): foo(move(_foo)) {};
};
struct Derived : public Owner {
User user;
Derived(unique_ptr<Foo> …Run Code Online (Sandbox Code Playgroud)