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.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.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
CMD
se ejecuta uno (el último): consulte https://docs.docker.com/engine/reference/builder/#cmdfuente
CMD
conRUN
.Como las otras respuestas ya han explicado, solo
CMD
se 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 run
odocker-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 muestraroot
el 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 -l
porCMD cat /etc/crontab
.Todo esto no tiene nada que ver con ningún comando dockerfile como
ADD
,RUN
oCMD
, es solo algo básico de Linux.fuente
ADD . /etc/crontab
ya que eso no funciona.