2017-10-13 96 views
6

Chcę utworzyć obraz dokowania z alpejskim i apache. Używam tini jako "init" -System. Działa, dopóki nie odłączę i nie przyłączę się do pojemnika. Po przymocowaniu do kontenera wyjście apache i pojemnik się zatrzymuje. Nie wiem, na czym polega problem. Czy ktoś miał podobne problemy z docker, alpine i apache?Apache z Dockerem Alpine Linux

My Dockerfile wygląda następująco (Wcześniej użyłem Alpines menedżera pakietów dla 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"] 

wejście i wyjście do dokowanym 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 

Aktualizacja: Problem wydaje się być apache2, który odbiera SIGWINCH (zmiana rozmiaru okna), podczas gdy docker dołącza do conta 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 nadużywa sygnału w połączeniu z narzędziem apachectl, aby z wdziękiem wyłączyć serwer. Czy można zablokować ten sygnał, aby nie był przekazywany do apache?

Odpowiedz

2

Prawdą jest, że Apache używa SIGWINCH wywołać wdzięku zamknięcie:

docker kill ----signal=SIGWINCH apache 

docker-library/httpd issue 9 wspomina

Nawet po prostu spada "-t" należy usunąć wysyłanie SIGWINCH gdy okno zmienia rozmiar.

Właściwie potrzebujesz tylko -d: patrz PR669.
W twoim przypadku już uruchamiasz obraz z -dit, więc sprawdź, czy pomoc w przechowywaniu -d może pomóc.

Oryginalny numer (po stronie httpd, a nie w oknie dokowanym) został opisany w dokumencie bug id 1212224.

OP Sebi2020 potwierdza in the comments:

jeśli nie podłączyć tty sygnał nie jest wysłać

Więc jeśli to możliwe, należy unikać -t i, jeśli to konieczne, dodać docker exec -t session jeśli potrzebujesz tty.

+0

szukam rozwiązania, które nie ograniczają drogę uruchomieniu pojemnik Döcker np z '-t' lub nie. – Sebi2020

+0

@ Sebi2020 OK, ale po pierwsze, po prostu utrzymywałbyś -D pracował w twoim przypadku? – VonC

+0

Tak, jeśli nie podłączę tty, sygnał nie zostanie wysłany. – Sebi2020

1

można spróbować przełączania swoją dyspozycję exec formCMD do shell form co prowadzi do /bin/sh -c <...> używany, gdy pojemnik jest prowadzony:

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

To wtedy nie ma już PID 1 i sygnały Unix nie są przekazywane do podprocesów .

Ale nie jestem pewien (w zależności od przepływu pracy), czy można attach lub exec -it do lub stop kontenera, jak chcesz.

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

+0

Ale to omija tini, która pobiera procesy zombie. – Sebi2020