1
votes

docker-compose ne peut pas reconnaître le fichier conteneur sudoers

J'ai PHP Dockerfile:

$ 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

Cela fonctionne via 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

Et ne fonctionne pas via docker-compose: p >

...
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"]
...

Comment éviter l'invite de mot de passe sudo dans docker-compose?


0 commentaires

3 Réponses :


0
votes

Notez que vous allouez un pseudo tty avec -t . Faites de même dans docker-compose avec tty: true .


2 commentaires

C'est juste une habitude. $ docker run -d php7.4-fpm et $ docker exec 8fdaaf155629 ps aux - fonctionne comme prévu


@cetver avez-vous essayé tty: true ?



0
votes

Je ne sais pas si l'explication est correcte, mais cela fonctionne:

La variable d'environnement DEBIAN_FRONTEND = noninteractive est coupable, il faut la partager

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"]

Merci à https://superuser.com/a/1001684/192832


0 commentaires

1
votes

En général, vous n'utilisez pas du tout sudo dans Docker: il est pratiquement impossible de définir un mot de passe utilisateur en toute sécurité, et chaque fois que vous exécutez un conteneur, vous pouvez directement spécifier l'ID utilisateur qu'il utilise ( avec l'option docker run -u ). Les conteneurs n'exécutent qu'un seul processus et n'ont généralement pas plusieurs utilisateurs.

Dans l'exemple particulier que vous avez ici, vous exécutez en théorie le conteneur en tant qu'utilisateur non root, mais le processus de conteneur principal est un l'invocation sudo qui revient immédiatement à l'utilisateur root. Vous pouvez éliminer l'étape intermédiaire ici et spécifier simplement

USER root
CMD php-fpm${PHP_VERSION} --nodaemonize


0 commentaires