Docker 以 root 身份挂载卷

标签 docker permissions docker-volume

为什么 Docker 将卷挂载为 root , 不是作为运行命令的用户 docker run ?这可以通过设置一些参数/参数等来改变吗?

MWE:

$ ls -la
drwxr-xr-x 2 ubuntu   ubuntu   4096 Aug 22 18:09 shinylog

$ docker run -v $(pwd)/test_dir/:/home/ --name nginx -d nginx
bf340face11485a81ee7c208d490f11abbdc84089ffe9c01d71ffcf8b9ffc27d

$ ls -la
drwxr-xr-x 2 ubuntu   ubuntu   4096 Aug 22 18:09 shinylog
drwxr-xr-x 2 root     root   4096 Aug 22 18:33 test_dir

$ echo $USER
ubuntu

编辑:
安装docker后我遇到错误:
Got permission denied while trying to connect to the Docker 
daemon socket at unix:///var/run/docker.sock: Get 
http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/json: dial 
unix /var/run/docker.sock: connect: permission denied

并执行:
sudo usermod -a -G docker $USER

也许这就是问题所在?

最佳答案

运行 nginx 的进程在 root 下运行,因此它使用 root 的 UID 写入文件。

解决方案

export UID && docker run -v $(pwd)/test_dir/:/home/ -u=$UID:$UID  --name nginx -d nginx

这将使用您的本地 UID 运行 nginx 进程,从而使用相同的用户写入文件。我没有在 mac 下测试过,但这是 linux 上的常见解决方案/设置,所以它对你有用。

你如何验证这是否有效?

使用 sleep 运行 nginx 使其运行很长时间,即使配置错误。
export UID && docker run -v $(pwd)/test_dir/:/home/ -u $UID:$UID --name nginx -d nginx sleep 3000000000000

现在在容器中执行并运行 whoami 以验证用户的 uid。例如在我的机器上
docker exec -it nginx /bin/bash
I have no name!@f12fa9c368e6:/$ whoami
whoami: cannot find name for user ID 501

关于Docker 以 root 身份挂载卷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51973179/

相关文章:

ASP.NET/IIS7.5写入日志文件不起作用(权限,UAC,配置,???)

docker - Docker卷偶尔安装得太晚,无法与其他容器共享文件

tomcat - 使用 jboss 或 tomcat 服务器在 docker 中运行 java 应用程序

linux - 是什么在我的笔记本电脑上启动这个 docker 进程?

postgresql - Docker Tomcat 容器无法访问 Postgres 容器

docker - 使一个容器中的目录可用于另一个容器,同时保留原始容器中的文件

docker - Docker:将数据从主机复制到已挂载的主机目录,以从运行的容器访问数据

mysql - Docker (Apple Silicon/M1 Preview) MySQL "no matching manifest for linux/arm64/v8 in the manifest list entries"

wordpress - 无法在 docker-compose 中添加对 docker volume 的写入权限

mysql - 在 MySQL 中向具有特定前缀的表授予权限