Tengo un Dockerfile para instalar el servidor MySQL en un contenedor, que luego comienzo así:
sudo docker run -t -i 09d18b9a12be /bin/bash
Pero el servicio MySQL no se inicia automáticamente, tengo que ejecutarlo manualmente (desde dentro del contenedor):
service mysql start
¿Cómo inicio automáticamente el servicio MySQL cuando ejecuto el contenedor docker?
Respuestas:
Primero, hay un problema en su
Dockerfile
:Las imágenes de Docker no guardan los procesos en ejecución. Por lo tanto, su
RUN
comando se ejecuta solo durante ladocker build
fase y se detiene después de completar la compilación. En su lugar, debe especificar el comando cuando el contenedor se inicia utilizando los comandosCMD
oENTRYPOINT
como se muestra a continuación:En segundo lugar, el contenedor acoplable necesita un proceso (último comando) para seguir ejecutándose; de lo contrario, el contenedor saldrá / se detendrá. Por lo tanto, el
service mysql start
comando normal no se puede usar directamente en el Dockerfile.Solución
Hay tres formas típicas de mantener el proceso en ejecución:
Usar el
service
comando y agregar un comando sin fin después de eso comotail -F
Esto se prefiere a menudo cuando tiene un único servicio en ejecución, ya que hace que el registro de salida sea accesible para la ventana acoplable.
O use el comando de primer plano para hacer esto
Esto funciona solo si hay un script como
mysqld_safe
.O envuelve tus scripts
start.sh
y pon esto al finalEsto es mejor si el comando debe realizar una serie de pasos, nuevamente,
/start.sh
debe seguir ejecutándose.Nota
Para el principiante
supervisord
no se recomienda el uso. Honestamente, es exagerado. Es mucho mejor usar un solo servicio / comando único para el contenedor.Por cierto: consulte https://registry.hub.docker.com para ver las imágenes existentes de MySQL Docker para referencia
fuente
docker exec -it <CONTAINER NAME> mysql /etc/init.d/mysqld restart
En su
Dockerfile
, agregue en la última líneaEsto funciona para mi
Y este es el resultado:
fuente
docker stop
o condocker restart
gracia, solo puede ser asesinado.¡Sencillo! Agregar al final del dockerfile:
fuente
Docker version 18.09.7, build 2d0083d
sin&& /bin/bash
el servicio se detendrá de inmediatoHay otra forma de hacerlo que siempre he encontrado que es más legible.
Digamos que quieres iniciar rabbitmq y mongodb cuando lo ejecutas y luego tu
CMD
se vería así:Ya que solo puedes tener uno
CMD
porDockerfile
truco, es concatenar todas las instrucciones&&
y luego usarlas\
para cada comando para comenzar una nueva línea.Si termina agregando a muchos de ellos, le sugiero que ponga todos sus comandos en un archivo de script y lo inicie como sugirió @ larry-cai:
fuente
En mi caso, tengo una aplicación web PHP 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. Creé un
entrypoint.sh
archivo dentro del cual administro mis servicios. Creo que crear unentrypoint.sh
cuando tienes más de un comando para ejecutar cuando se inicia tu contenedor es una forma más limpia de arrancar el acoplador.fuente
ENTRYPOINT ['your location']
instrucción al archivo de script. Sin embargo, recuerde establecer los permisos de ejecución en su script.COPY entrypoint.sh /entrypoint.sh RUN chmod 755 /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
. En este ejemplo, copié mi punto de entrada al directorio raíz en el contenedor docker.Tengo el mismo problema cuando quiero iniciar automáticamente el servicio ssh. Encontré que agregar
a puede resolverlo, pero solo lo abre con bash lo hará.fuente
Agrego 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, el archivo 'docker_services' se creará en las imágenes y no se ejecutará ningún servicio.
fuente
Así es como inicio automáticamente el servicio MySQL cada vez que se ejecuta el contenedor docker.
En mi caso, necesito ejecutar no solo MySQL sino también PHP, Nginx y Memcached
Tengo las siguientes líneas en Dockerfile
Agregar && bash mantendría a Nginx, MySQL, PHP y Memcached ejecutándose dentro del contenedor.
fuente
Esto no funciona
CMD service mysql start && /bin/bash
Esto no funciona
CMD service mysql start ; /bin/bash ;
- Supongo que el modo interactivo no admitiría el primer plano.
Esto funciona !!
CMD service nginx start ; while true ; do sleep 100; done;
Esto funciona !!
CMD service nginx start && tail -F /var/log/nginx/access.log
tenga cuidado con que debe usar
docker run -p 80:80 nginx_bash
sin parámetro de comando.fuente
La siguiente documentación del sitio web de Docker muestra cómo implementar un servicio SSH en un contenedor de Docker. Debe ser fácilmente adaptable para su servicio:
Aquí también se ha hecho una variación de esta pregunta:
fuente
Es posible que necesite podar el contenedor existente usando la podadora de Docker ...
Importar con modificaciones requeridas:
Ejecute el contenedor, por ejemplo, con la opción siempre reiniciar para asegurarse de que se reanudará automáticamente después del reciclaje de host / demonio:
Nota al margen: En mi opinión, lo razonable es comenzar solo el servicio cron dejando el contenedor lo más limpio posible y luego modificar crontab o cron.hourly, .daily, etc. con los scripts de verificación / monitoreo correspondientes. La razón es que solo confía en un demonio y, en caso de cambios, es más fácil con ansible o puppet redistribuir scripts cron en lugar de rastrear servicios que comienzan en el arranque.
fuente