在Ubuntu上运行Docker:装载的主机卷无法从容器写入

ohfgkhjo  于 2023-10-16  发布在  Docker
关注(0)|答案(3)|浏览(145)

Docker在Mac上运行得很好,但我必须在VirtualBox(或Parallels或VMWare Fusion)中运行Docker主机,因为Mac的内核不支持Docker。
因此,我尝试在Ubuntu桌面上设置我的应用程序和Docker-compose- natively,其中Docker客户端和Docker主机在同一个系统上物理运行。这是有效的,但是我运行的docker容器不能写入挂载的主机卷。
我使用docker-compose,设置如下:

volumes:
   - ./api:/usr/src/app

因此,我将主机Ubuntu OS的“API”目录挂载到/usr/src/app下的docker容器中。
docker inspect <container ID>显示卷是可写的

"Destination": "/usr/src/app",
"Mode": "rw",
"RW": true

然而,它不是:当我尝试从docker容器中创建一个目录或编辑一个文件时,我会得到permission denied
当然,我在谷歌上搜索了这个问题,我遇到了一些SELinux的CentOS/RHEL问题,但是我运行的是Ubuntu 15.10,64位版本,而不是CentOS。

q9rjltbz

q9rjltbz1#

如果主机上的uidid -u)与docker容器(通常为“docker”)中的用户的uid不相同,那么您可能会遇到此问题。您可以尝试:
1.使您的用户和docker容器中的用户的UID相同。
1.将目录上的组权限设置为您和docker所属的组可写。
1.您也可以使用核选项:
chmod a+rwx -R project-dir/
核选项将使您的git工作区变得肮脏,这将使您非常烦恼,因此不是最佳的长期解决方案。它能止血。
为了进一步理解这个问题,你可能会发现这些有用的:

  1. https://github.com/docker/docker/issues/7906
  2. https://github.com/docker/docker/issues/7198
vxbzzdmp

vxbzzdmp2#

新答案:

这个问题似乎有很多流量,现在有更好的解决方案-fixuid,顾名思义,它是一个神奇的可执行文件,可以在容器启动时更改容器用户的uid和gid(使用-u somebody:somebody)。
有关更多详细说明,请参阅:https://boxboat.com/2017/07/25/fixuid-change-docker-container-uid-gid/

老答案:

从Docker 1.7版本开始,你可以选择挂载一个主机目录,并使用:Z或:z标志来访问容器,如下所示:

docker run -v ./api:/usr/src/app:Z
  • :z -将使用标签“svirt_sandbox_file_t”向所有容器添加权限
  • :Z -将仅向当前容器标签添加权限

从docker-compose v1.4.0开始,你可以像这样在docker compose中使用它:

volumes:
   - ./api:/usr/src/app:Z

虽然我应该补充一下,但我仍然有一些问题(参见Adding permissions to host directory with docker-compose)。
参考文献:
将Linux与Docker一起使用可能会导致SELinux出现问题-http://www.projectatomic.io/blog/2015/06/using-volumes-with-docker-can-cause-problems-with-selinux/
Docker用户指南-https://docs.docker.com/engine/userguide/dockervolumes/#volume-labels
Docker-compose release notes for v1.4.0 - https://github.com/docker/compose/releases/tag/1.4.0

nue99wik

nue99wik3#

如果你的本地配置不包含directory "/var/...",那么它可能试图把文件放到另一个没有服务器访问权限的目录中。将其添加到将进入容器的本地配置中

  • 注意:这适用于特定的bind9 docker容器,不要忘记先备份你的配置文件,并确保没有重要的内容会受到影响 *

相关问题