Tengo un contenedor Docker con software instalado y configurado.
No se supone que ningún programa se inicie / ejecute todo el tiempo.
Lo que quiero: su capacidad para iniciar algún comando en función de eventos externos. me gusta:
docker exec mysupercont /path/to/mycommand -bla -for
y
docker exec mysupercont /path/to/myothercommand
Pero "exec" es imposible cuando se detiene el contenedor, y también este contenedor tiene algunos datos "funcionales" en el interior, que se utilizan para esos comandos, por lo que no puedo usar
docker run ...
cada vez, porque recrea el contenedor de la imagen y destruye mis datos.
¿Cuál es la forma "correcta" y la "mejor" para mantener ese contenedor en funcionamiento? ¿Qué comando puedo comenzar adentro?
docker run -d --name=name container tail -f /dev/null
Respuestas:
No necesita realizar cada vez
docker run
.docker run
es en realidad una secuencia de dos comandos: "crear" y "iniciar".Cuando ejecute el contenedor, debe especificar "
-it
":Ejemplo:
Después de que el trabajo se completó el comando especificado al inicio (en mi ejemplo bash). Por ejemplo, realiza la "salida". Contenedor se detiene:
Ahora puedes comenzar de nuevo
El contenedor se inicia y nuevamente ejecuta el comando "bash".
Conéctese a esta sesión "bash" con el comando
Para resumir : tienes que entender la diferencia entre el
run
y elstart
contenedor.Además, mire la documentación para el papel de los parámetros "
-i t
" y "-d
" para el "Ejecutar"fuente
docker attach ID
. Sal de esta sesión sin finalizar bash, puedes usarCTRL-p CTRL-q
Todo este asunto de si puede o no iniciar un contenedor detenido depende de cómo se creó originalmente el contenedor, es decir, de cómo se ejecuta. Si ejecutó un comando que finalizó o sale de un comando interactivo, por ejemplo, bash, no puede iniciar, reiniciar o ejecutar el contenedor detenido. Todo lo que puedes hacer es eliminarlo. Es basura
Pero el último comentario de taranaki, use '-itd', parece ser lo que ordenó el acoplador.
El contenedor sigue ejecutándose, y puede ejecutar lo que quiera, y puede detener, iniciar o reiniciar el contenedor. Por supuesto, esto es solo un hallazgo preliminar basado en la imagen alpina. Tenga en cuenta que si se conecta al contenedor, se detendrá cuando salga, pero puede iniciarlo nuevamente.
fuente
Como mencionó las tareas periódicas y probablemente esté usando algo como cron debido a la forma en que desea usar
docker exec
, tengo la medicina para usted. Al menos terminé haciendo algo como esto.Dockerfile
Corre con lo habitual
docker run -d ....
(solíadocker-compose
)Configurar máquinas host crontab, por ejemplo:
Considero que esta solución es agradable, ya que podemos confiar en el antiguo y probado crontab en un entorno Linux bastante predeterminado, mientras que Docker maneja los deps y las variables de entorno más exóticos de su lógica de negocios. También puede establecer algunos límites si sus tareas periódicas se atascan y tienen pérdidas de memoria o lo que sea.
fuente
La cola seguirá causando algunas operaciones de archivo de vez en cuando.
Aquí está mi solución para dormir para siempre, sin efectos secundarios.
Cómo funciona
fuente