Docker将用户和组指定为exec命令选项

我需要从一个php / php-7.1容器内执行一些命令,作为一个特殊的(标准)用户和PHP-fpm守护进程使用的“ www-data:www-data ”组。

www-data在主机上同时以用户和组的forms存在,并且条目存在于:

  • / etc / passwd www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
  • / etc / group www-data:x:33:

无论如何,当容器运行时,我首先得到www-data uid和gid,如下所示:

 // con_php is the running container's name echo $(docker exec -it con_php bash -c 'echo "$(id -u www-data)"''":"''"$(id -g www-data)"') // outputs 33:33, great ! 

然后我使用这个(作为一个命令行replace)来提供给我需要在容器中运行的实际命令提供的–user选项。 我现在有:

 docker exec \ --user $(docker exec -it con_php bash -c 'echo "$(id -u www-data)"''":"''"$(id -g www-data)"') \ con_php \ bash -c 'cd /var/www/project ; touch test.txt' 

不幸的是 ,在执行时,Docker会抱怨并输出一个错误:

:组文件中没有匹配的条目


以下方法(带有临时variables的bash脚本)导致相同的问题:

 #! /bin/bash usr=$(docker exec -it con_php bash -c 'echo "$(id -u www-data)"''":"''"$(id -g www-data)"') echo "» $usr" docker exec --user $usr con_php bash -c 'cd /var/www/project ; touch test.txt' 

»33:33
:组文件中没有匹配的条目

感谢您的帮助。

从docker集装箱内检索数据有时候会派上用场。
当心,如果你使用echo收集输出作为一个字(或一行)。 确保使用-n选项来防止后面的换行符被预置。

 $ docker exec -it my_container bash -c 'echo -n "$(…)"' 

否则,您在使用输出时可能会遇到失败/不当行为。
像在Bash进程命令中的参数一样。