Мне нужно выполнить некоторые команды изнутри php / php-7.1 контейнер как специальный (стандартный) пользователь и группа, известная как «www-data: www-data»Используется демоном php-fpm.
www-data существует как пользователь и как группа на хост-машине, а записи существуют в:
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
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 !
Затем я использую это (как подстановку в командной строке) для подачи --пользователь параметр, предоставленный фактической команде, которую мне нужно запустить внутри контейнера. Теперь у меня есть:
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
: нет совпадающих записей в файле группы
Спасибо за помощь.
Иногда бывает полезно получить данные из контейнера докеров.
Остерегайтесь, если вы используете echo
собрать вывод в виде слова (или отдельной строки). Обязательно используйте -n
опция, которая предотвращает добавление конечного символа новой строки.
$ docker exec -it my_container bash -c 'echo -n "$(…)"'
В противном случае вы можете столкнуться с ошибкой или некорректным поведением при использовании вывода.
Как аргумент в команде процесса Bash.