docker -compose не может распознать файл контейнера sudoers - PullRequest
1 голос
/ 19 апреля 2020

У меня PHP Dockerfile:

...
USER root
echo "${SYSTEM_USERNAME}    ALL=NOPASSWD: /usr/sbin/php-fpm${PHP_VERSION}" >> /etc/sudoers.d/${SYSTEM_USERNAME}
...
USER ${SYSTEM_USERNAME}
CMD ["/usr/bin/env", "sh", "-c", "sudo php-fpm${PHP_VERSION} --nodaemonize"]
...

Работает через docker:

$ docker run -dit php7.4-fpm
$ docker exec -it 2e9331162630 ps aux                                                                                                           
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
php-7-4      1  0.0  0.0   2384   764 pts/0    Ss+  15:48   0:00 sh -c sudo php-
root         6  0.0  0.0   6592  3224 pts/0    S+   15:48   0:00 sudo php-fpm7.4
root         7  0.0  0.3 635904 33796 ?        Ss   15:48   0:00 php-fpm: master
www-data     8  0.0  0.0 635904  7968 ?        S    15:48   0:00 php-fpm: pool w

И не работает через docker -составить:

$ docker-compose up
php_1    | 
php_1    | We trust you have received the usual lecture from the local System
php_1    | Administrator. It usually boils down to these three things:
php_1    | 
php_1    |     #1) Respect the privacy of others.
php_1    |     #2) Think before you type.
php_1    |     #3) With great power comes great responsibility.
php_1    | 
php_1    | sudo: no tty present and no askpass program specified
docker_php_1 exited with code 1

Как избежать запроса пароля sudo в docker -compose?

Ответы [ 3 ]

1 голос
/ 20 апреля 2020

Как правило, вы вообще не используете sudo в Docker: практически невозможно безопасно установить пароль пользователя, и всякий раз, когда вы запускаете контейнер, вы можете напрямую указать используемый им идентификатор пользователя (с помощью * Опция 1002 *). Контейнеры запускают только один процесс и обычно не имеют нескольких пользователей.

В приведенном здесь конкретном примере вы теоретически запускаете контейнер как пользователь, не являющийся root, но как основной процесс контейнера. является вызовом sudo, который немедленно переключается обратно на пользователя root. Вы можете исключить промежуточный шаг здесь и просто указать

USER root
CMD php-fpm${PHP_VERSION} --nodaemonize
0 голосов
/ 19 апреля 2020

Не уверен, что объяснение правильное, но оно работает:

Переменная среды DEBIAN_FRONTEND=noninteractive виновна, необходимо поделиться ей

PHP Dockerfile:

ENV ...
    # Avoid 'debconf: unable to initialize frontend: Dialog'
    DEBIAN_FRONTEND=noninteractive
...
USER root
echo "${SYSTEM_USERNAME}    ALL=NOPASSWD:SETENV: /usr/sbin/php-fpm${PHP_VERSION}" >> /etc/sudoers.d/${SYSTEM_USERNAME}
...
USER ${SYSTEM_USERNAME}
CMD ["/usr/bin/env", "sh", "-c", "sudo --preserve-env=DEBIAN_FRONTEND php-fpm${PHP_VERSION} --nodaemonize"]

Спасибо https://superuser.com/a/1001684/192832

0 голосов
/ 19 апреля 2020

Обратите внимание, что вы выделяете псевдотермы с -t. Сделайте то же самое в docker -составить с tty: true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...