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

如何从docker容器正确编辑主机目录,docker,dockerfile,docker-container,Docker,Dockerfile,Docker Container,这里我不是问如何将目录从主机装载到docker容器,而是问如何从容器编辑装载的目录 我将提供关于我的用例的更多细节 现在我正在使用Gitlab fork,使用GDK Gitlab开发工具包,在安装过程中,我运行以下命令: gdk install gitlab_repo=https://gitlab.com/MY-FORK/gitlab.git 此命令将在项目中创建一个名为gitlab的目录 为了完成这个项目,我将使用主机上的文本编辑器,所以我需要同步这两个目录 这是我的尝试: docker r

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

我将提供关于我的用例的更多细节

现在我正在使用Gitlab fork,使用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)的权限和所有权与容器本身中使用的权限和所有权不匹配时,主机卷绑定装载到容器中的目录会出现权限问题。您需要调整容器中使用的用户,更改主机上文件的权限,或者两者都需要

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

请注意,这是一个非常典型的问题,也是我尝试在可能的情况下使用docker的本地驱动程序使用命名卷的原因。命名卷初始化为映像的内容,包括文件权限,您可以使用单独的管理容器对其进行管理,该容器装载相同的卷以进行任何更改,例如运行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

我尝试过类似的方法,但使用绑定装载卷-v:@MrSpark我已经在这样做了,问题是默认行为是仅从主机更改此卷,但在我的情况下,我需要主机/容器都能够编辑此卷内容谢谢,我知道如果我在Dockerfile中安装时将目录所有者更改为容器用户,就可以从容器内部编辑该目录,对吗?然后如何主机用户和编辑它再次,我需要两者都可以做任何修改要求不太确定我下面的评论。我用一个例子更新了我的答案。如果这仍然令人困惑,请提供您自己的解决方案。谢谢。谢谢,伙计,你关于权限和所有权的提示帮助解决了这个问题