Назад | Перейти на главную страницу

Docker, определяющий пользователя и группу в качестве параметров команды exec

Мне нужно выполнить некоторые команды изнутри php / php-7.1 контейнер как специальный (стандартный) пользователь и группа, известная как «www-data: www-data»Используется демоном php-fpm.

www-data существует как пользователь и как группа на хост-машине, а записи существуют в:

В любом случае, пока контейнер работает, я сначала получаю 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.