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
La siguiente documentación del sitio web Docker muestra cómo implementar un servicio SSH en un contenedor acoplable. Debe ser fácilmente adaptable para su servicio:
También se ha hecho una variación sobre esta pregunta aquí:
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 comotail -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 finalCMD /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.