tag run remove name hub example docker

run - Docker mĂșltiples puntos de entrada



docker tag example (7)

Como dijo Jared Markell, si desea iniciar varios procesos en un contenedor de docker, debe usar el supervisor . Deberá configurar el supervisor para decirle que inicie sus diferentes procesos.

Escribí sobre esto en esta publicación de blog , pero aquí tienes un artículo muy bueno que detalla cómo y por qué usar el supervisor en Docker.

Básicamente, querrás hacer algo como:

FROM ubuntu RUN apt-get update RUN apt-get install -y apache2 RUN apt-get install -y mongod #pretend this exists RUN apt-get install -y supervisor # Installing supervisord ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf EXPOSE 80 ENTRYPOINT ["/usr/bin/supervisord"]

Y agrega una configuración de un archivo supervisord.conf

[supervisord] nodaemon=true [program:mongodb] command=/etc/mongod/mongo #To adapt, I don''t know how to launch your mongodb process [program:apache2] command=/usr/sbin/apache2 -DFOREGROUND

EDITAR : Como esta respuesta ha recibido bastantes votaciones ascendentes, quiero precisar como una advertencia de que usar Supervisor no se considera una buena práctica para ejecutar varios trabajos. En su lugar, puede interesarle crear varios contenedores para sus diferentes procesos y administrarlos a través de Docker Componer . En pocas palabras, Docker Compose le permite definir en un archivo todos los contenedores necesarios para su aplicación y ejecutarlos en un solo comando.

Digamos que tengo el siguiente Dockerfile:

FROM ubuntu RUN apt-get update RUN apt-get install -y apache2 RUN apt-get install -y mongod #pretend this exists EXPOSE 80 ENTRYPOINT ["/usr/sbin/apache2"]

El comando ENTRYPOINT hace para que apache2 comience cuando se inicia el contenedor. También quiero poder iniciar mongod cuando el contenedor comience con el service mongod start comando service mongod start . De acuerdo con la documentation , sin embargo, solo debe haber un ENTRYPOINT en un archivo Docker. ¿Cuál sería la forma correcta de hacer esto entonces?


Hay una respuesta en docker docs: https://docs.docker.com/config/containers/multi-service_container/

Pero en resumen

Si necesita ejecutar más de un servicio dentro de un contenedor, puede lograrlo de diferentes formas.

El primero es ejecutar un script que gestione su proceso.

El segundo es usar el administrador de procesos como supervisord


La respuesta simple es que no deberías hacerlo porque rompe el principio de responsabilidad única: un contenedor, un servicio. Imagine que desea generar imágenes en la nube adicionales de MongoDB debido a una carga de trabajo repentina. ¿Por qué aumentar las instancias de Apache2 también y en una proporción de 1: 1? En su lugar, debe vincular los cuadros y hacer que hablen a través de TCP. Consulte https://docs.docker.com/userguide/dockerlinks/ para obtener más información.


Mi solución es lanzar scripts individuales en /opt/run/ y ejecutarlos con:

#!/bin/bash LOG=/var/log/all touch $LOG for a in /opt/run/* do $a >> $LOG & done tail -f $LOG

Y mi punto de entrada es solo la ubicación de este script, digamos que se llama /opt/bin/run_all :

ADD 00_sshd /opt/run/ ADD 01_nginx /opt/run/ ADD run_all /opt/bin/ ENTRYPOINT ["/opt/bin/run_all"]


No pude obtener el uso de && para trabajar. Pude resolver esto como se describe aquí: https://.com/a/19872810/2971199

Entonces en tu caso podrías hacer:

RUN echo "/usr/sbin/apache2" >> /etc/bash.bashrc RUN echo "/path/to/mongodb" >> /etc/bash.bashrc ENTRYPOINT ["/bin/bash"]

Puede necesitar / querer editar sus comandos de inicio.

Tenga cuidado si ejecuta su archivo Docker más de una vez, probablemente no quiera copias múltiples de comandos anexados a su archivo bash.bashrc . Puede usar grep y una instrucción if para hacer que su comando RUN idempotente.


No puede especificar múltiples puntos de entrada en un archivo Docker. Para ejecutar varios servidores en el mismo contenedor acoplable, debe usar un comando que pueda iniciar sus servidores. Supervisord ya ha sido citado, pero también podría recomendar multirun , un proyecto mío que es una alternativa más ligera.


Puedo pensar de varias maneras:

  • puede escribir un script para poner en el contenedor ( ADD ) que hace todos los comandos de inicio, luego ponerlo en el ENTRYPOINT
  • Creo que puedes poner cualquier comando de shell en ENTRYPOINT , para que puedas hacer el service mongod start && /usr/sbin/apache2