我在共享卷上创建的文件的权限方面遇到了问题(不幸的是,这是一个常见问题)。当我在 Linux(ubuntu)上运行以下命令时,创建的文件最终归 拥有root
。当我在 OSX 上运行此命令时,该文件最终归运行 docker 命令的用户所有。
cd
mkdir temp-docker
docker run --rm -v ~/temp-docker/:/root/temp ubuntu /bin/touch /root/temp/touched
ls -la temp-docker/touched
# rm -Rf temp-docker
Linux 的输出
-rw-r--r-- 1 root root 0 Nov 24 09:48 temp-docker/touched
osx 的输出
-rw-r--r-- 1 MyUser staff 0B 24 Nov 09:48 temp-docker/touched
有没有办法轻松模仿 OSX 的行为?或者这是否恰好有效,因为 OSX 在后台使用了 vagrant 和 vboxsf,而无法在 Linux 上轻松重现这种情况?
答案1
我不知道“容易”是什么意思,它需要以非 root 用户身份运行容器(无论如何你都应该这样做)。
但这里有一个示例,运行 Docker 1.9
我的 Dockerfile 看起来像这样:
FROM ubuntu:14.04
# Setup user environment
RUN useradd -d /home/dtest -m dtest
# Create a shared data volume
RUN mkdir /var/shared/
RUN chown -R dtest:dtest /var/shared
VOLUME /var/shared
WORKDIR /home/dtest
# Link in shared parts to the home directory
RUN ln -s /var/shared /home/dtest/shared
RUN chown -R dtest: /home/dtest
USER dtest
CMD /bin/bash
构建我的图像后,我们将其称为dtest/test
,我像这样运行它:
$ docker run --rm -v $(pwd):/var/shared/ -it dtest/test bash
# on the container:
dtest@33b5a1ee6c62:~$ ls -l
total 0
lrwxrwxrwx 1 dtest dtest 11 Nov 24 20:47 shared -> /var/shared
dtest@33b5a1ee6c62:~$ ls -l shared/
total 4
-rw-r--r-- 1 dtest staff 642 Nov 24 20:47 Dockerfile
dtest@33b5a1ee6c62:~$ echo "Test" > /var/shared/foo
dtest@33b5a1ee6c62:~$ ls -l $(pwd)/shared/
total 8
-rw-r--r-- 1 dtest staff 642 Nov 24 20:47 Dockerfile
-rw-r--r-- 1 dtest staff 5 Nov 24 20:52 foo
# on the OSX host
$ ls -l
total 16
-rw-r--r-- 1 dtest staff 642 Nov 24 15:47 Dockerfile
-rw-r--r-- 1 dtest staff 5 Nov 24 15:52 foo
这也适用于 Docker 1.8.x,尽管我必须在将其添加为之前在 /var/shared 中添加一个空文件VOLUME
:
# Create a shared data volume
# We need to create an empty file, otherwise the volume will
# belong to root.
# This is probably a Docker bug.
RUN mkdir /var/shared/
RUN touch /var/shared/placeholder
RUN chown -R dtest:dtest /var/shared
VOLUME /var/shared
该方法的功劳归于这篇博文关于创建 devbox 的提示。