Nginx acoplado no está comenzando


He intentado seguir algunos tutoriales y documentación sobre dockerizing mi servidor web, pero estoy teniendo problemas para que el servicio se ejecute a través del comando docker run.

Este es mi 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 mi imagen:

docker build -t myImage .

Y cuando lo ejecute:

docker run -p 81:80 myImage

Parece que simplemente se detiene:

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

Esperaría que esto se ejecute con el puerto 81->80, pero no lo es. Corriendo

docker start 90e

No parece hacer nada.

También intenté entrando directamente

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

Y desde aquí puedo iniciar el servicio

service nginx start

Y desde otra pestaña puedo ver que está funcionando como estaba previsto (también en mi navegador):

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 

Así que supongo que es algo que estoy haciendo mal con mi Dockerfile? Podría alguien ayudarme con esto, soy bastante nuevo en Docker. ¡Gracias!

SOLUCIÓN: Basado en la respuesta de Ivant encontré otra manera de iniciar nginx en primer plano. Mi Dockerfile CMD ahora se ve como:

CMD /usr/sbin/nginx -g "daemon off;"
Author: Vini.g.fer, 2014-06-16

4 answers

El contenedor Docker se ejecuta siempre que el comando que especifique con CMD, ENTRTYPOINT o a través de la línea de comandos se está ejecutando. En su caso, el comando service termina de inmediato y todo el contenedor se apaga.

Una forma de solucionar esto es iniciar nginx directamente desde la línea de comandos (asegúrese de no ejecutarlo como un demonio).

Otra opción es crear un pequeño script que inicia el servicio y luego duerme para siempre. Algo como:

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

Y ejecute esto en lugar de ejecutando directamente el comando service.

Una tercera opción sería usar algo como runit o un programa similar, en lugar del servicio normal.

 19
Author: ivant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-16 10:30:24

A partir de ahora, la imagen oficial de nginx usa esto para ejecutar nginx (ver el Dockerfile):

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

En mi caso, esto fue suficiente para que comenzara correctamente. Hay tutoriales en línea que sugieren formas más incómodas de lograr esto, pero lo anterior parece bastante limpio.

 52
Author: Ben Creasy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-20 00:36:32

Usando docker-compose:

Para seguir la solución recomendada, agréguela a docker-compose.yml:

command: nginx -g "daemon off"

También encontré que simplemente podía agregar a nginx.conf:

daemon off;

...y seguir utilizando en docker-compose.yml:

command: service nginx start

...aunque haría el archivo de configuración menos portable fuera de docker.

 5
Author: macsteps,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-05 19:42:00

Docker como un muy buen índice de imágenes oficiales y de usuario. Cuando quieres hacer algo, es probable que alguien ya lo haya hecho;)

Simplemente busque 'nginx' en index.docker.io, verás, hay una imagen oficial de nginx: https://registry.hub.docker.com/_/nginx /

Allí tienes una guía completa para ayudarte a iniciar tu servidor web.

No dude en echar un vistazo a otros usuarios nginx imagen para ver variantes:)

La idea es iniciar nginx en primer plano modo.

 4
Author: creack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-16 21:59:38