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