在不注销或子shell的情况下更新组

我试图在Elastic MapReducestream上运行Docker,但遇到权限问题。 在我的引导脚本中,我需要“hadoop”用户成为“docker”组的一部分(如在AWS Docker Basics页面中所述 ):

sudo usermod -a -G docker hadoop 

但我不能注销或产生一个子shell(与newgrp)。 有没有办法强制组设置在我当前的shell会话中生效?

没有 – 除非hadoop进程以root身份运行,那么你可以做一些gdb的诡计来改变EUID ,而不是组。 但我想这对你的情况没有帮助。

有什么可以帮助的是暂时允许hadoop用户访问为docker组访问的文件。

例如: hadoop用户需要对/foo目录的写入权限,但是目前只有docker组可以写入:

 $ ls -ld / foo /
 drwxrwx --- 2 root docker 4096 Mar 10 00:42 / foo /

现在大多数文件系统都支持ACL :

 $ sudo setfacl -mg:docker:rwx / foo

现在hadoop用户将能够写入/foo

我知道,这不是你所要求的,但是由于没有可能改变正在运行的进程的EGID,所以在ACL的帮助下可能是相反的。

我花了一段时间才弄清楚如何在EMR上运行Hadoop Streaming上的Docker。 事实certificate,执行这项工作的用户是yarn而不是hadoop 。 所以引导脚本需要有以下几行:

 sudo useradd -r yarn # create 'yarn' since it does not exist yet sudo usermod -a -G docker yarn 

请注意,我手动创buildyarn用户,因为当引导脚本运行Hadoop尚未安装