我需要从内部执行一些命令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 进程命令中的参数。