Mac 和 Linux 上的 Docker 存在权限问题

Mac 和 Linux 上的 Docker 存在权限问题

我在共享卷上创建的文件的权限方面遇到了问题(不幸的是,这是一个常见问题)。当我在 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 的提示。

相关内容