2017-10-13 8 views
6

Je veux créer une image docker avec alpine et apache. J'utilise tini comme un système "init". Cela fonctionne jusqu'à ce que je détache et me rattache au récipient. Après la fixation sur le conteneur apache quitte et le conteneur s'arrête. Je ne sais pas quel est le problème. Quelqu'un a-t-il eu des problèmes similaires avec docker, alpine et apache?Apache avec Docker Alpine Linux

Mon Dockerfile ressemble à ceci (Avant, je gestionnaire de paquets Alpines pour tini)

FROM alpine 
ENV TINI_VERSION v0.16.1 
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /sbin/tini 
RUN chmod +x /sbin/tini 
RUN apk add --no-cache apache2 \ 
    && mkdir -p /run/apache2 \ 
    && ln -sf /dev/stdout /var/log/apache2/access.log \ 
    && ln -sf /dev/stderr /var/log/apache2/error.log 
EXPOSE 80 
ENTRYPOINT ["/sbin/tini", "-vvv", "-g", "--"] 
CMD ["/usr/sbin/httpd", "-f", "/etc/apache2/httpd.conf", "-DFOREGROUND"] 

entrée et de sortie docker cli:

~/Desktop/[email protected] 
$ docker run -itd test1 
a793bad5d4350f58893909f1552c9f2978d8e2952960ac667f8dcb2bf7a3516e 

~/Desktop/[email protected] 
$ docker container ls 
CONTAINER ID  IMAGE    COMMAND     CREATED    
STATUS    PORTS    NAMES 
a793bad5d435  test1    "/sbin/tini -vvv -..." 12 seconds 
ago  Up 11 seconds  80/tcp    sharp_neumann 

~/Desktop/[email protected] 
$ docker attach a7 
[DEBUG tini (1)] Received SIGCHLD 
[DEBUG tini (1)] Reaped child with pid: '5' 
[INFO tini (1)] Main child exited normally (with status '0') 
[TRACE tini (1)] No child to wait 
[TRACE tini (1)] Exiting: child has exited 

Mise à jour: Le problème semble être apache2, qui reçoit le SIGWINCH (changement de taille de fenêtre) tandis que le docker s'attache au iner:

[Sun Oct 15 12:13:24.592575 2017] [mpm_prefork:notice] [pid 5] AH00170: caught SIGWINCH, shutting down gracefully 
[DEBUG tini (1)] Received SIGCHLD 
[DEBUG tini (1)] Reaped child with pid: '5' 
[INFO tini (1)] Main child exited normally (with status '0') 
[TRACE tini (1)] No child to wait 
[TRACE tini (1)] Exiting: child has exited 

Apache abuse du signal en liaison avec l'utilitaire apachectl pour fermer correctement le serveur. Est-il possible de bloquer ce signal afin qu'il ne soit pas transmis à Apache?

Répondre

2

Il est vrai que Apache utilise SIGWINCH pour déclencher un arrêt progressif:

docker kill ----signal=SIGWINCH apache 

docker-library/httpd issue 9 mentions

Même juste laisser tomber "-t" devrait supprimer l'envoi de SIGWINCH lorsque la fenêtre est redimensionnée.

En fait, vous avez juste besoin de -d: voir PR669.
Dans votre cas, vous exécutez déjà l'image avec -dit, vérifiez donc si garder simplement -d peut aider.

Le problème d'origine (côté httpd, pas docker) est décrit dans bug id 1212224.

Le OP Sebi2020 confirme in the comments:

si je ne me connecte pas TTY le signal est envoyé non

Donc, si possible, d'éviter les -t et, si nécessaire, ajouter un docker exec -t session si vous avez besoin de tty.

+0

Je cherche une solution qui ne limite pas la façon dont vous exécutez le conteneur docker par exemple avec -t ou non. – Sebi2020

+0

@ Sebi2020 OK, mais d'abord, garderais-tu le travail dans votre cas? – VonC

+0

Oui, si je ne connecte pas un tty, le signal n'est pas envoyé. – Sebi2020

1

Vous pourriez essayer de changer vos instructions CMD de exec form à shell form qui conduit à /bin/sh -c <...> utilisé lorsque le conteneur est exécuté:

CMD /usr/sbin/httpd -f /etc/apache2/httpd.conf -DFOREGROUND 
# or use ENTRYPOINT with the same shell form 

Il a ensuite n'a plus PID 1 et les signaux Unix ne sont pas transmis à sous-processus .

Mais je ne suis pas sûr (en fonction de votre flux de travail) si vous pouvez attach ou exec -it ou le conteneur stop comme vous le souhaitez.

Références:
http://www.johnzaccone.io/entrypoint-vs-cmd-back-to-basics/
(3) Fact
https://docs.docker.com/engine/reference/builder/#cmd https://docs.docker.com/engine/reference/builder/#shell-form-entrypoint-example

+0

Mais cela contourne tini, qui recueille les processus de zombies. – Sebi2020