2014-06-16 8 views
23

Ho provato a seguire alcuni tutorial e documentazione sul docker del mio server web, ma sto riscontrando problemi nel far funzionare il servizio tramite il comando di esecuzione della finestra mobile.Nginx Dockerized non è in fase di avvio

Questo è il mio Dockerfile:

FROM ubuntu:trusty 

#Update and install stuff 
RUN apt-get update 
RUN apt-get install -y python-software-properties aptitude screen htop nano nmap nginx 

#Add files 
ADD src/main/resources/ /usr/share/nginx/html 

EXPOSE 80 
CMD service nginx start 

creo la mia immagine:

docker build -t myImage . 

E quando l'eseguo:

docker run -p 81:80 myImage 

sembra fermare solo:

docker ps -a 

CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES 
90e54a254efa  pms-gui:latest  /bin/sh -c service n 3 seconds ago  Exit 0         prickly_bohr 

Mi aspetto che funzioni con la porta 81-> 80 ma non lo è. In esecuzione

docker start 90e 

non sembra fare nulla.

Ho anche provato immettendola direttamente

docker run -t -i -p 81:80 myImage /bin/bash 

e da qui posso iniziare il servizio

service nginx start 

e da un'altra scheda posso vedere che sta funzionando come previsto (anche nel mio browser) :

CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES 
408237a5e10b  myImage:latest  /bin/bash   12 seconds ago  Up 11 seconds  0.0.0.0:81->80/tcp mad_turing 

Quindi presumo che stia facendo qualcosa di sbagliato con il mio Dockerfile? Qualcuno potrebbe darmi una mano con questo, sono abbastanza nuovo per Docker. Grazie!

SOLUZIONE: Sulla base della risposta di Ivant ho trovato un altro modo per avviare nginx in primo piano. Il mio Dockerfile CMD ora assomiglia:

CMD /usr/sbin/nginx -g "daemon off;" 

risposta

17

contenitore Docker funziona finché il comando specificata con CMD, ENTRTYPOINT o tramite la riga di comando è in esecuzione. Nel tuo caso il comando service termina immediatamente e l'intero contenitore viene chiuso.

Un modo per risolvere questo problema è avviare nginx direttamente dalla riga di comando (assicurarsi di non eseguirlo come daemon).

Un'altra opzione è quella di creare un piccolo script che avvia il servizio e quindi si addormenta per sempre. Qualcosa di simile:

#!/bin/bash 
service nginx start 
while true; do sleep 1d; done 

ed eseguire questo invece di eseguire direttamente il comando service.

Una terza opzione sarebbe quella di utilizzare qualcosa come runit o un programma simile, anziché il servizio normale.

+0

Grazie, questo è abbastanza ovvio quando lo spieghi :) Ora ho creato uno script di loop e probabilmente evolverò quella soluzione nel tempo. Adesso almeno so perché! – Solvemon

+0

Le prime righe dovrebbero essere probabilmente parte della documentazione. – Vor

4

Docker come un indice molto bello di immagini ufficiali e utente. Quando vuoi fare qualcosa, è probabile che qualcuno lo abbia già fatto;)

Basta cercare 'nginx' su index.docker.io, vedrai, c'è un'immagine ufficiale di nginx: https://registry.hub.docker.com/_/nginx/

Lì hai una guida completa per aiutarti ad avviare il tuo webserver.

Sentitevi liberi di dare un'occhiata in altri utenti immagine nginx per vedere le varianti :)

L'idea è di iniziare nginx in modalità primo piano.

+0

Il pezzo chiave è l'istruzione CMD in https://github.com/nginxinc/docker-nginx/blob/master/stable/stretch/Dockerfile: 'CMD [" nginx "," -g "," daemon off "; ] ' – bonh

41

A partire da ora, l'immagine ufficiale nginx utilizza per eseguire nginx (vedi the Dockerfile):

CMD ["nginx", "-g", "daemon off;"]

Nel mio caso, questo è stato sufficiente per ottenere che venga avviato correttamente. Ci sono tutorial online che suggeriscono modi più scomodi per realizzare questo, ma quanto sopra sembra abbastanza pulito.

+3

Questa è la strada giusta. – wieczorek1990

5

Utilizzando finestra mobile-composizione:

di seguire la soluzione consigliata, aggiungo alla finestra mobile-compose.yml:

command: nginx -g "daemon off" 

Ho anche scoperto che potrei semplicemente aggiungere nginx.conf:

daemon off; 

... e continuare a utilizzare in finestra mobile-compose.yml:

command: service nginx start 

... anche se renderebbe il file di configurazione meno portatile all'esterno della finestra mobile.

Problemi correlati