Docker在挂载卷中以root用户身份创建文件

44
我正在使用 Docker(1.3.1)在容器中构建 RPM 包:

我正在使用 Docker(1.3.1)在容器内进行 RPM 构建:

docker run -v /home/matt/build:/build build-rpm /build/build-pkg.sh

这个命令很好用(我的用户在docker组里,所以我不需要使用sudo),并在当前目录下下生成了一个完成的.rpm 文件。问题是该文件的所有者是root。

我该如何改变它,使得该文件的所有者与我运行docker的用户相同?


这样文件就会被创建为与我运行docker相同的用户所有。但是在docker虚拟环境中,这是root用户,它不知道您的用户是谁。 - Paul Oliver
3
请查看我在这个问题上的回答 - https://dev59.com/O14c5IYBdhLWcg3wc5_r - ISanych
2
@PaulOliver 在Docker容器中运行的进程并不知道我的主机用户,就像它们不知道我已经把卷挂载到主机的哪个位置一样。然而,Docker确实允许我指定卷在主机上的位置;同样地,我能否指定新文件的(主机)用户身份创建? - Matt R
1
@ISanych -- 很好,你的解决方案很聪明并且有效(希望Docker有更简单的解决方案,但是...) - Matt R
2个回答

13

您可以尝试在自定义镜像的Dockerfile中创建一个用户,并将其设置为容器使用的用户。

RUN adduser --system --group --shell /bin/sh auser \
 && mkdir /home/auser/bin
USER auser

然后,检查docker run -v /home/matt/build:/build build-rpm是否将共享文件夹挂载到/build作为auser


问题2259中提到的另一个选项:

如果你在绑定挂载之前(在主机端)使用chown更改卷的所有权,则它将起作用。
在这种情况下,您可以执行以下操作:

mkdir /tmp/www
chown 101:101 /tmp/www
docker run -v /tmp/www:/var/www ubuntu stat -c "%U %G" /var/www
(假设 101:101 是您容器中 www-data 用户的 UID:GID 。)

1
请注意,父文件夹(如果有)将属于根目录。在您的示例中没有,但了解这一点很好。 - Thomas Decaux

3

Docker以root身份运行,并不知道在其虚拟环境中你的用户是谁(即使你在sudoers组中)。但是,你可以在构建docker镜像时创建一个非root用户,这个用户可以被命名为任何你喜欢的名字。

# create a non-root user named tester, 
# give them the password "tester" put them in the sudo group
RUN useradd -d /home/tester -m -s /bin/bash tester && echo "tester:tester" | chpasswd && adduser tester sudo

# start working in the "tester" home directory
WORKDIR /home/tester
COPY ./src

# Make the files owned by tester
RUN chown -R tester:tester /home/tester

# Switch to your new user in the docker image
USER tester

33
我不太担心容器内的用户身份。但是从主机的角度来看,我希望这个文件最终的所有者是运行 docker run 命令的用户。这种方法是否有助于实现这一点? - Matt R
1
除非您使用相同的UID和GID将文件复制回您的计算机,否则该文件不会归您所有。http://superuser.com/questions/580592/does-file-user-ownership-change-when-transferring-files-between-computers - Paul Oliver
2
我猜我已经习惯了在Vagrant虚拟机上简单地操作/vagrant:客户端对文件所有者的视图与主机不同。 - Matt R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接