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?
3 Réponses :
Notez que vous allouez un pseudo tty avec -t .
Faites de même dans docker-compose avec tty: true .
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 ?
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"]
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