如何从 docker 容器中正确编辑主机目录

How to properly edit host directory from a docker container

这里我不是问如何从主机挂载目录到 docker 容器,而是如何从容器编辑挂载的目录。

我将提供有关我的用例的更多详细信息

现在我正在开发 Gitlab 分支,并使用 GDK (Gitlab 开发工具包) 并且在安装过程中,我 运行 这个命令:

gdk install gitlab_repo=https://gitlab.com/MY-FORK/gitlab.git

此命令将在项目中创建一个名为 gitlab

的目录

为了处理这个项目,我将使用主机上的文本编辑器,所以我需要同步这两个目录

这是我的尝试:

docker run -it -p 3000:3000 -v /gitlab:${project-location}/gitlab ${image-name}

这种方法的问题是当我运行执行安装命令时:

gdk install gitlab_repo=https://gitlab.com/MY-FORK/gitlab.git 

它失败了,因为它试图更改挂载目录中的文件,而这是不允许的(权限被拒绝)

提示:所有安装步骤都在 Dockerfile 中进行了描述,因此所有内容都 运行 在容器中!

那么有解决方法或其他方法吗?

当主机上文件的权限和所有权(通常是 UID)与容器本身内部使用的权限和所有权不匹配时,主机卷(将挂载目录绑定到容器中)会出现权限问题。您需要调整容器内使用的用户和/或更改主机上文件的权限。

另一个可能的问题是对 Windows 使用 Docker 或对 Mac 使用 Docker 并使用不与嵌入式 VM 共享的目录。在这些情况下,卷安装将导致一个空文件夹。默认情况下,/Users 与这两种产品中的 VM 共享。

请注意,此问题非常典型,这也是我尽可能使用 docker 的 "local" 驱动程序来使用命名卷的原因。命名卷初始化为图像的内容,包括文件权限,您可以使用单独的管理容器来管理它们,该容器为您需要进行的任何更改安装相同的卷(例如,一个简单的 busybox 容器 运行 a tar -xzf 更新内容)。


编辑:这是一个从容器内部编辑文件的例子

$ ls -al data
total 16
drwxr-xr-x  4 bmitch bmitch 4096 Jun  8  2016 .
drwxr-xr-x 12 bmitch bmitch 4096 Jan 22 20:13 ..
-rw-r--r--  1 bmitch bmitch    0 Jun  8  2016 1
-rw-r--r--  1 bmitch bmitch    0 Jun  8  2016 2
drwxr-xr-x  2 bmitch bmitch 4096 Jun  8  2016 a
drwxr-xr-x  2 bmitch bmitch 4096 Jun  8  2016 b

$ id
uid=1000(bmitch) gid=1000(bmitch) groups=1000(bmitch),24(cdrom),27(sudo),120(bluetooth),127(vboxusers),999(docker)

$ docker run -v `pwd`/data:/data -u 1000 -it --rm busybox

/ $ ls -al /data
total 16
drwxr-xr-x    4 1000     1000          4096 Jun  8  2016 .
drwxr-xr-x   19 root     root          4096 Jan 23 10:24 ..
-rw-r--r--    1 1000     1000             0 Jun  8  2016 1
-rw-r--r--    1 1000     1000             0 Jun  8  2016 2
drwxr-xr-x    2 1000     1000          4096 Jun  8  2016 a
drwxr-xr-x    2 1000     1000          4096 Jun  8  2016 b

/ $ echo 'hello from inside the container' >/data/inside-container.txt

/ $ ls -al /data
total 20
drwxr-xr-x    4 1000     1000          4096 Jan 23 10:25 .
drwxr-xr-x   19 root     root          4096 Jan 23 10:24 ..
-rw-r--r--    1 1000     1000             0 Jun  8  2016 1
-rw-r--r--    1 1000     1000             0 Jun  8  2016 2
drwxr-xr-x    2 1000     1000          4096 Jun  8  2016 a
drwxr-xr-x    2 1000     1000          4096 Jun  8  2016 b
-rw-r--r--    1 1000     root            32 Jan 23 10:25 inside-container.txt

/ $ cat /data/inside-container.txt
hello from inside the container

/ $ exit

$ ls -al data
total 20
drwxr-xr-x  4 bmitch bmitch 4096 Jan 23 05:25 .
drwxr-xr-x 12 bmitch bmitch 4096 Jan 22 20:13 ..
-rw-r--r--  1 bmitch bmitch    0 Jun  8  2016 1
-rw-r--r--  1 bmitch bmitch    0 Jun  8  2016 2
drwxr-xr-x  2 bmitch bmitch 4096 Jun  8  2016 a
drwxr-xr-x  2 bmitch bmitch 4096 Jun  8  2016 b
-rw-r--r--  1 bmitch root     32 Jan 23 05:25 inside-container.txt