tag remove name images hub dockers container compose change docker

docker - remove - ¿Cómo iniciar automáticamente un servicio al ejecutar un contenedor acoplable?



docker-compose (9)

¡Sencillo! Agregar al final de dockerfile:

ENTRYPOINT service mysql start && /bin/bash

Tengo un Dockerfile para instalar el servidor MySQL en un contenedor, que luego empiezo así:

sudo docker run -t -i 09d18b9a12be /bin/bash

Pero el servicio MySQL no se inicia automáticamente, tengo que ejecutarlo manualmente (desde el contenedor):

service mysql start

¿Cómo inicio automáticamente el servicio MySQL cuando ejecuto el contenedor Docker?


Agregué el siguiente código a /root/.bashrc para ejecutar el código solo una vez,

Confirme el contenedor con la imagen antes de ejecutar este script; de lo contrario, se creará el archivo ''docker_services'' en las imágenes y no se ejecutará ningún servicio.

if [ ! -e /var/run/docker_services ]; then echo "Starting services" service mysql start service ssh start service nginx start touch /var/run/docker_services fi


Así es como comienzo automáticamente el servicio MySQL cada vez que se ejecuta el contenedor acoplable.

En mi caso, necesito ejecutar no solo MySQL sino también PHP, Nginx y Memcached

Tengo las siguientes líneas en Dockerfile

RUN echo "daemon off;" >> /etc/nginx/nginx.conf EXPOSE 80 EXPOSE 3306 CMD service mysql start && service php-fpm start && nginx -g ''daemon off;'' && service memcached start && bash

Agregar && bash mantendría Nginx, MySQL, PHP y Memcached ejecutándose dentro del contenedor.


En mi caso, tengo una aplicación web PHP que es servida por Apache2 dentro del contenedor acoplable que se conecta a una base de datos back-end MYSQL. La solución de Larry Cai funcionó con modificaciones menores. entrypoint.sh un archivo entrypoint.sh dentro del cual estoy administrando mis servicios. Creo que crear un entrypoint.sh cuando tienes más de un comando para ejecutar cuando se inicia el contenedor es una forma más limpia de arrancar el acoplador.

#!/bin/sh set -e echo "Starting the mysql daemon" service mysql start echo "navigating to volume /var/www" cd /var/www echo "Creating soft link" ln -s /opt/mysite mysite a2enmod headers service apache2 restart a2ensite mysite.conf a2dissite 000-default.conf service apache2 reload if [ -z "$1" ] then exec "/usr/sbin/apache2 -D -foreground" else exec "$1" fi


En su Dockerfile , agregue en la última línea

ENTRYPOINT service ssh restart && bash

Esto funciona para mi

Y este es el resultado:

root@ubuntu:/home/vagrant/docker/add# docker run -i -t ubuntu * Restarting OpenBSD Secure Shell server sshd [ OK ] root@dccc354e422e:~# service ssh status * sshd is running


Hay otra forma de hacerlo que siempre he encontrado más legible.

Diga que quiere iniciar rabbitmq, mongodb y desea tener la imagen correcta en su docker tan pronto como la ejecute, entonces su CMD se vería así:

CMD /etc/init.d/rabbitmq-server start && / /etc/init.d/mongod start && / /bin/bash

Como puede tener solo una CMD por Dockerfile el truco consiste en concatenar todas las instrucciones con && y luego usar / para cada comando para comenzar una nueva línea y, por lo tanto, hacerla más legible.

Si termina agregando muchos de ellos, le sugiero que ponga todos sus comandos en un archivo de script y lo inicie como lo sugirió @ larry-cai:

CMD /start.sh



Primero, hay un problema en su Dockerfile :

RUN service mysql restart && /tmp/setup.sh

Las imágenes de Docker no guardan los procesos en ejecución. Por lo tanto, su comando RUN ejecuta solo durante la fase de docker build y se detiene después de que se complete la compilación. En su lugar, debe especificar el comando cuando el contenedor se inicie utilizando los comandos CMD o ENTRYPOINT como a continuación:

CMD mysql start

En segundo lugar, el contenedor Docker necesita un proceso (último comando) para seguir funcionando; de lo contrario, el contenedor saldrá / se detendrá. Por lo tanto, el comando service mysql start normal no se puede usar directamente en Dockerfile.

Solución

Hay tres formas típicas de mantener el proceso en ejecución:

  • Usar el comando de service y anexar un comando no final después de eso como tail -F

    CMD service mysql start && tail -F /var/log/mysql/error.log

Esto a menudo se prefiere cuando tiene un solo servicio en ejecución, ya que hace que el registro de salida sea accesible para el acoplador.

  • O use el comando de primer plano para hacer esto

    CMD /usr/bin/mysqld_safe

Esto funciona solo si hay un script como mysqld_safe .

  • O envuelva sus scripts en start.sh y ponga esto en final

    CMD /start.sh

Esto es mejor si el comando debe realizar una serie de pasos, nuevamente, /start.sh debe seguir funcionando.

Nota

Para el principiante que usa supervisord no se recomienda. Honestamente, es excesivo. Es mucho mejor usar un solo servicio / comando único para el contenedor.

Por cierto: por favor, consulte https://registry.hub.docker.com para ver las imágenes del docker mysql existentes como referencia


docker export -o <nameOfContainer>.tar <nameOfContainer>

Puede ser necesario podar el contenedor existente con Docker Poune ...

Importar con las modificaciones requeridas:

cat <nameOfContainer>.tar | docker import -c "ENTRYPOINT service mysql start && /bin/bash" - <nameOfContainer>

Ejecute el contenedor, por ejemplo, con la opción siempre reiniciar para asegurarse de que se reanudará automáticamente después de reciclar el host / daemon:

docker run -d -t -i --restart always --name <nameOfContainer> <nameOfContainer> /bin/bash

Nota al pie: En mi opinión, lo razonable es comenzar solo el servicio cron, dejando el contenedor lo más limpio posible, luego simplemente modificar crontab o cron.hourly, .daily, etc. con los correspondientes scripts de chequeo / monitoreo. La razón es que solo confía en un daemon y, en caso de cambios, es más fácil con ansible o títere redistribuir los scripts cron en lugar de seguir los servicios que se inician en el arranque.