Mi Dockerfile parece compilarse correctamente (me lo dice). Cuando ejecuto el contenedor, aparece el siguiente mensaje de error. He intentado ejecutar los comandos (CMD
) con y sin el directorio del servicio.
crontab.sh
bá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.10MAINTAINER TomVOLUME /var/log/RUN mkdir /pulseADD . /pulseWORKDIR /pulseRUN apt-get update && apt-get install -y cronADD *.sh /pulse/RUN chmod 750 /pulse/crontab.sh && chmod 750 /pulse/RUN chmod 644 /etc/crontabCMD cron -fCMD touch /var/log/cron.log && sh /pulse/crontab.sh && tail -f /var/log/cron.logCMD cron /pulse/cron.jobsCMD crontab -l
edited to add crontab.sh
crontab.sh (se han eliminado algunos crons):
#!/bin/bashcat <<- 'EOF' > cron.jobs0 * * * * node /pulse/scripts/awsPulseTest.js > /tmp/awsPulseTest.log 2>&1EOFcrontab cron.jobs
Error:
no crontab for root
Notas al margen:
- Pulse es el nombre del servicio.
- La versión de node es antigua debido al servicio, se actualizará.
- El servicio es esencialmente para trabajos cron en node
Es un problema con el dockerfile (en lugar de los comandos en el archivo).Solo una CMD
se ejecuta (el último) - ver https://docs.docker.com/engine/reference/builder/#cmd
Solo puede haber una instrucción CMD en un Dockerfile. Si enumera más de un CMD, solo el último CMD surtirá efecto.
Como las otras respuestas ya han explicado, solo una CMD
se ejecutará por Dockerfile y el comando que desea ejecutar es incorrecto.
Pero hay un problema más apremiante con su configuración IMO: los contenedores Docker generalmente no están diseñados para funcionar de esta manera. Lo que debe hacer en su lugar es ejecutar los servicios cron desde el host (o su orquestador) como procesos únicos (probablemente usando algo como docker run
o docker-compose run
, o, si por alguna razón no desea iniciar un contenedor separado para esto, supongo que podría usar docker exec
).
Sin embargo, esta es solo mi opinión sobre cómo se deben usar los contenedores, por lo que obviamente debe tomarlo con un grano de sal.
Si agrega esto a /etc/crontab
, esto no se mostraría en el crontab personal de root, ya que contiene solo el crontab específico del usuario editado con crontab -e
, no el de todo el sistema en /etc
.
Más detalles:
Mi conjetura es que /pulse/crontab.sh
(que no muestras, ¿por qué?) agrega la línea crontab relevante al archivo crontab de todo el sistema /etc/crontab
. Más tarde, ejecuta el comando crontab -l
, pero esto solo muestra un error porque enumera root
s personal solo crontab (que está vacío), no el de todo el sistema en /etc/crontab
. Todo esto es perfectamente normal y esperado. Para mostrar la línea que agregó su script, reemplazaría CMD crontab -l
con CMD cat /etc/crontab
.
Todo esto no tiene nada que ver con ningún comando dockerfile como ADD
, RUN
o CMD
, es solo cosas básicas de Linux.