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

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

我会详细介绍一下我的用例

现在我正在使用Gitlab fork,并使用GDK (Gitlab Development Kit),并在安装过程中运行以下命令:

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

这个命令将在名为gitlab的项目中创build一个目录

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

这是我的尝试:

 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)的权限和所有权与容器内部使用的文件的权限和所有权不匹配,主机卷的权限问题(绑定到容器中的目录)就会发生。 您需要调整容器内使用的用户,更改主机上文件的权限,或两者。

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

请注意,这个问题是相当典型的,我尽可能使用docker的“本地”驱动程序尝试使用命名卷的原因。 命名卷初始化为映像的内容(包括文件权限),并且可以通过使用单独的pipe理容器来pipe理它们,该容器为所需的任何更改装入相同的卷(例如,运行tar -xzf的简单busybox容器更新内容)。


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

 $ 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