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

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

我需要从内部执行一些命令php/php-7.1容器作为特殊(标准)用户和组,又名 «www-数据:www-数据» 由 php-fpm 守护进程使用。

www-数据在主机上同时存在用户和组,并且条目存在于:

  • 密码文件 /etc/passwd www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
  • /etc/组 www-data:x:33:

无论如何,当容器运行时,我首先得到www-数据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 !

然后我用这个(作为命令行替换)来提供- 用户为我需要在容器内运行的实际命令提供的选项。我现在有:

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 会抱怨并输出错误:

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


以下方法(带有临时变量的 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
:组文件中没有匹配的条目

感谢您的帮助。

答案1

从 docker 容器中检索数据有时会派上用场。
如果您使用echo将输出收集为单词(或一行),请小心。确保使用-n可防止在末尾添加换行符的选项。

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

否则,在使用输出时可能会遇到故障/行为不当。
例如作为 Bash 进程命令中的参数。

相关内容