Sí. Cron del host o un temporizador de systemd pueden invocar un comando de contenedor de una sola ejecución, pero deben reproducir el entorno, la identidad, la red y las reglas de bloqueo de la aplicación.
Esto se convierte en una cuestión real de compatibilidad cuando una aplicación autoalojada necesita limpieza, indexación, exportación o copias de seguridad periódicas sin añadir un demonio de cron al contenedor de la aplicación. Empieza con una ruta o cuenta desechable, conserva disponible el estado de trabajo anterior y evalúa el diseño según la carga de trabajo original, no según una prueba de conexión puntual.
Define el contrato de programación y ciclo de vida
La rama compatible es un comando idempotente de una sola ejecución iniciado con la misma configuración del proyecto. La rama competidora es un trabajo del host al que le faltan el entorno, el directorio de trabajo, el bloqueo o la disponibilidad del servicio. Registra las versiones, identidades, direcciones, rutas de montaje, permisos y el estado observable actual antes de cambiar cualquiera de las dos ramas.
El comportamiento relevante de container exec define el primer límite de compatibilidad. Úsalo para delimitar la afirmación y, después, verifica el mismo comportamiento en este servidor doméstico concreto, en lugar de tratar una función documentada como prueba de que todo el diseño funciona.
Escribe la regla de decisión antes de probar: el éxito debe hacer que el trabajo llegue al servicio previsto, rechace una ejecución simultánea insegura, escriba en los volúmenes esperados y emita un fallo visible distinto de cero; el fallo incluye que el comando use un proyecto diferente, pierda secretos, se inicie antes que sus dependencias o que dos ejecuciones modifiquen el mismo estado. Esto evita interpretar una conexión parcial o una salida limpia del comando como compatibilidad de extremo a extremo.
Ejecuta el trabajo con la identidad de producción
Usa un único elemento diferenciador controlado: ejecuta manualmente el comando exacto como el usuario del host programado, captura el entorno y el estado de salida y, después, activa dos ejecuciones desechables superpuestas. Mantén constantes el cliente, la carga de trabajo, el conjunto de archivos, la cuenta y el momento, para que el componente modificado sea la única explicación plausible.
Usa las reglas de entorno de crontab para elegir la segunda observación importante para esta ruta. Captura ambos lados de la transacción: resolución o ruta, protocolo negociado, identidad del proceso, estado de salida, latencia, bytes transferidos y cualquier evento de recuperación.
Repite la prueba después del evento del ciclo de vida mencionado en el título: recreación, reconexión, remontaje, reinicio, conmutación por error o cambio de cliente. Un diseño que funciona solo mientras los sockets, las cachés o las credenciales antiguas permanecen activos no ha superado la prueba.
cd /srv/app && flock -n /run/app-job.lock docker compose exec -T app app-cli job
Interpreta la superposición, el fallo y el estado de salida
APROBADO: el trabajo llega al servicio previsto, rechaza una ejecución simultánea insegura, escribe en los volúmenes esperados y emite un fallo visible distinto de cero. Guarda las versiones exactas y la topología que produjeron este estado, porque la conclusión se aplica a esas condiciones y no a todas las implementaciones del protocolo.
FALLIDO: el comando usa un proyecto diferente, pierde secretos, se inicia antes que sus dependencias o dos ejecuciones modifican el mismo estado. Comprueba las dependencias compartidas, como DNS, MTU, identidad, estado del cortafuegos, latencia del almacenamiento y sesiones en caché, antes de declarar responsable a cualquiera de las ramas principales.
EXCEPCIÓN: desactiva la programación, restaura la definición de trabajo anterior y añade una ruta de proyecto, un bloqueo, un tiempo de espera y comprobaciones de estado explícitos. No amplíes privilegios, elimines datos de origen, debilites la seguridad del transporte ni sustituyas el almacenamiento operativo hasta que una observación reproducible identifique qué límite falló.
Verifica la siguiente ejecución programada, no solo la primera
Aplica únicamente la acción correspondiente a la rama observada y, después, vuelve a ejecutar la carga de trabajo original. Conserva el diseño solo cuando el trabajo llegue al servicio previsto, rechace una ejecución simultánea insegura, escriba en los volúmenes esperados y emita un fallo visible distinto de cero durante dos ciclos de vida relevantes y bajo la carga simultánea esperada.
Usa las políticas de reinicio del servicio para verificar el flujo de trabajo dependiente más cercano. Su comportamiento de acceso, temporización y recuperación debe permanecer sin cambios mientras el nuevo diseño esté activo.
Detente y vuelve al estado guardado si el comando usa un proyecto diferente, pierde secretos, se inicia antes que sus dependencias o dos ejecuciones modifican el mismo estado. Escala el problema con marcas de tiempo, versiones exactas, evidencias de ruta o montaje y la reproducción más pequeña, en lugar de añadir otra solución provisional.
Contrasta el resultado con las comprobaciones de estado del contenedor para asegurarte de que el riesgo no se traslada simplemente a otra capa de red, identidad, copias de seguridad o almacenamiento.
Por lo tanto, para los trabajos de contenedor programados en el host, la respuesta matizada es el criterio inicial, no un sí incondicional. El estado observable de aprobado es la línea de aceptación; el estado de fallo es la línea de reversión.
Preguntas frecuentes
¿Cron debe usar docker exec o docker compose run?
Usa exec para ejecutar un comando dentro del servicio en ejecución; usa una ejecución de una sola vez cuando la imagen admita un contenedor de trabajo aislado.
¿Dónde deben guardarse los registros de los trabajos programados?
Envía la salida estándar y el error estándar a un registro del host conservado o a una ruta de supervisión, y genera una alerta cuando el estado de salida sea distinto de cero.
¿Qué ocurre durante una actualización de la aplicación?
Pausa o bloquea el temporizador para que no pueda solaparse con migraciones, congelaciones de copias de seguridad o sustituciones de contenedores.
Soporte y Consejos
Más para leer

¿Puede una galería autoalojada conservar el emparejamiento de las Live Photos de Apple?
Una decisión condicional sobre un servidor doméstico para emparejar Apple Live Photo, con pruebas controladas, interpretación de resultados, reversión y preguntas frecuentes específicas.

¿Puedes importar Google Takeout y las copias de seguridad del teléfono en una sola biblioteca de fotos?
Una decisión condicional sobre un servidor doméstico para la importación combinada de fotos, con pruebas controladas, interpretación de resultados, reversión y preguntas frecuentes específicas.

¿Puede Immich usar una biblioteca externa sin hacerse cargo de los archivos?
Una decisión condicional sobre el servidor doméstico para la propiedad de bibliotecas externas de Immich, con pruebas controladas, interpretación de resultados, reversión y preguntas...

