docker: no hay crontab para root

10

Parece que mi Dockerfile se compila correctamente (me lo dice). Cuando ejecuto el contenedor, recibo el siguiente mensaje de error. He intentado ejecutar los comandos ( CMD) con y sin el directorio del servicio.

crontab.shbásicamente escribe una programación cron en un archivo de texto ( cron.jobs) y luego importa el archivo de texto a crontab.

Dockerfile:

FROM node:0.10
MAINTAINER Tom

VOLUME /var/log/

RUN mkdir /pulse
ADD . /pulse
WORKDIR /pulse

RUN apt-get update && apt-get install -y cron

ADD *.sh /pulse/
RUN chmod 750 /pulse/crontab.sh && chmod 750 /pulse/

RUN chmod 644 /etc/crontab

CMD cron -f
CMD touch /var/log/cron.log && sh /pulse/crontab.sh && tail -f /var/log/cron.log
CMD cron /pulse/cron.jobs
CMD crontab -l

edited to add crontab.sh

crontab.sh (se han eliminado algunos crons):

#!/bin/bash

cat <<- 'EOF' > cron.jobs

0 * * * * node /pulse/scripts/awsPulseTest.js > /tmp/awsPulseTest.log 2>&1

EOF

crontab cron.jobs

Error:

no crontab for root

Notas al margen:

  • Pulse es el nombre del servicio.
  • La versión del nodo es antigua debido al servicio, esto se actualizará.
  • El servicio es esencialmente para trabajos cron en el nodo
TomFirth
fuente
Una combinación de serverfault.com/a/851500/395574 y serverfault.com/a/851479/395574 ayudó a resolver esto.
TomFirth

Respuestas:

11

Es un problema con el dockerfile (en lugar de los comandos en el archivo). Solo CMDse ejecuta uno (el último): consulte https://docs.docker.com/engine/reference/builder/#cmd

Solo puede haber una instrucción CMD en un Dockerfile. Si enumera más de una CMD, solo la última CMD surtirá efecto.

Paul Haldane
fuente
Ah, y eso está por encima de todo :) Para OP: Esto no invalida mi explicación y esencialmente tendría que reemplazar su CMDcon RUN.
Sven
2
Creo que llamar a esto un problema está un poco fuera de lugar. Este comportamiento es por diseño. Los contenedores no son mini OS. Están centrados en la aplicación.
JimmyJames
Convenido. Mi intención era aclarar que el problema del OP radicaba en su configuración de docker en lugar de cualquier detalle de cron.
Paul Haldane
Este no es un problema de docker . Es por diseño.
Andrew Savinykh
5

Como las otras respuestas ya han explicado, solo CMDse ejecutará una por Dockerfile y el comando que desea ejecutar es incorrecto.

Pero hay un problema más urgente con su configuración IMO: los contenedores Docker generalmente no están diseñados para funcionar de esta manera. Lo que debería hacer en su lugar es ejecutar los servicios cron desde el host (o su orquestador) como procesos únicos (probablemente usando algo como docker runo docker-compose run, o, por alguna razón, no desea iniciar un contenedor separado para esto, yo supongo que podrías usar docker exec).

Sin embargo, esta es solo mi opinión sobre cómo deben usarse los recipientes, por lo que obviamente debe tomarlo con un grano de sal.

Artur Ciesielski
fuente
2
Solo tengo una familiaridad pasajera con cron, pero creo que para hacerlo más sensible, el CMD necesitaría ejecutar crond. De lo contrario, el contenedor se cerrará cuando finalice el comando crontab.
JimmyJames
@JimmyJames Lo que estás diciendo es correcto, pero como expliqué anteriormente, la mejor solución es ejecutar estos comandos desde un cron externo como mensajes únicos docker run. Más contenedor-y. :)
Artur Ciesielski
Podrías estar en lo cierto. La pregunta es interesante porque no está claro si tiene sentido ejecutar crond como comando de su contenedor. Puede ser viable pero parece incómodo en un contenedor.
JimmyJames
3

Si agrega esto /etc/crontab, esto no aparecerá en el crontab personal de root, ya que contiene solo el crontab específico del usuario editado crontab -e, no el sistema completo /etc.


Más detalles:

Supongo que /pulse/crontab.sh(lo que no muestra, ¿por qué?) Agrega la línea crontab relevante al archivo crontab de todo el sistema /etc/crontab. Luego ejecuta el comando crontab -l, pero esto solo muestra un error porque solo muestra rootel crontab personal (que está vacío), no el que está en todo el sistema /etc/crontab. Todo esto es perfectamente normal y esperado. Para mostrar la línea que agregó su secuencia de comandos, debe reemplazarla CMD crontab -lpor CMD cat /etc/crontab.

Todo esto no tiene nada que ver con ningún comando dockerfile como ADD, RUNo CMD, es solo algo básico de Linux.

Sven
fuente
Creo que entiendo esto. ¿Mi configuración de compilación está en el usuario pero mi configuración de ejecución está intentando ejecutarse desde el crontab de la raíz? eso tiene sentido, intentaré solucionarlo. Supongo que no quiso decir: ADD . /etc/crontabya que eso no funciona.
TomFirth
@ TomFirth: Esto no tiene mucho sentido. Por favor lea mi edición para más detalles.
Sven