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

Respuestas:
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/#cmdfuente
CMDconRUN.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 runodocker-compose run, o, por alguna razón, no desea iniciar un contenedor separado para esto, yo supongo que podrías usardocker 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.
fuente
docker run. Más contenedor-y. :)Si agrega esto
/etc/crontab, esto no aparecerá en el crontab personal de root, ya que contiene solo el crontab específico del usuario editadocrontab -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 comandocrontab -l, pero esto solo muestra un error porque solo muestrarootel 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 reemplazarlaCMD crontab -lporCMD cat /etc/crontab.Todo esto no tiene nada que ver con ningún comando dockerfile como
ADD,RUNoCMD, es solo algo básico de Linux.fuente
ADD . /etc/crontabya que eso no funciona.