cron de docker que no funciona

Estoy tratando de construir una imagen de docker que tenga un cron. Un cron que eliminará archivos de una ubicación particular del sistema de archivos docker. A continuación se muestra mi Dockerfile

FROM ubuntu:latestMAINTAINER docker@ekito.frRUN apt-get update && apt-get -y install cron# Copy testfiles folder to docker container.COPY ./testfiles /opt/# Create the log file to be able to run tailRUN touch /var/log/cron.logRUN (crontab -l -u root; echo "* * * * * root rm -rf /opt/*") | crontab# Run the command on container startupCMD cronENTRYPOINT ["/bin/sh", "-c", "/bin/bash"]

Todo es exitoso. mi cron también está configurado en el contenedor

roadrunner:test shailesh$ docker run -it crontest /bin/bashroot@ac31f5acc49f:/# lsbin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  varroot@ac31f5acc49f:/# crontab -l* * * * * root rm -rf /opt/*root@ac31f5acc49f:/# cd /opt/root@ac31f5acc49f:/opt# ls  file1  file10  file11  file12  file13  file14  file15  file16  file17  file18  file19  file2  file20  file21  file22  file23  file24  file25  file3  file4  file5  file6  file7  file8  file9

Sin embargo, no se está ejecutando y eliminando los archivos que están en /opt/ carpeta. ¿Puede alguien decirme qué está mal en la configuración?

Prueba algo como esto,

FROM ubuntu:latestMAINTAINER docker@ekito.frRUN apt-get update && apt-get -y install cron# Add crontab file in the cron directoryADD crontab /etc/cron.d/hello-cron# Give execution rights on the cron jobRUN chmod 0644 /etc/cron.d/hello-cron# Apply cron jobRUN crontab /etc/cron.d/hello-cron# Create the log file to be able to run tailRUN touch /var/log/cron.log# Run the command on container startupCMD cron && tail -f /var/log/cron.log

cree el archivo crontab y agregue una entrada como esta

* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1

Espero que esto te ayude!!!

Tu sintaxis de crontab es incorrecta.

Hay dos lugares donde puede colocar archivos cron:

  • en el propio archivo crontab del usuario, normalmente en /var/spool/cron/USERNAME. Aquí es donde las cosas se colocan automáticamente si usa el comando crontab.
  • en /etc/cron.d

Si lo coloca en /etc/cron.d, el archivo debe contener el nombre del usuario con el que lo está ejecutando, ya que de lo contrario no hay conexión entre el archivo y el usuario. Pero si usas el crontab comando, la especificación cron se colocará en el crontab que pertenece a su usuario (o al usuario que especifique al invocar crontab), por lo que no es necesario incluir el nombre de usuario.

Entonces, para solucionar esto, puede hacer una de dos cosas:

  • Puede eliminar el nombre de usuario de la cadena que está pasando al comando crontab, de modo que se vea así:

    EJECUTAR (crontab-l-u root; echo " * * * * * rm-rf / opt/*") | crontab
  • Puede colocar la entrada crontab en un archivo en /etc/cron.d en cambio, así:

    >EJECUTAR (echo "* * * * * root rm-rf / opt / * " /etc / cron.d / clearopt)

Tengo el mismo problema en el mismo contexto. Mi consejo es crear un script bash para hacer lo que quieras al inicio del contenedor.
y luego configure el CMD en el Dockerfile para ejecutarlo usando la sintaxis de matriz JSON.

Tengo un archivo start.sh para hacer algunas cosas y yo uso & para ejecutarlo en segundo plano y luego ejecuto cron & & amp; apache2-foregroung para iniciar el cron y el servidor apache.

Este es el comando final al final de mi Dockerfile:

CMD ./start.sh > web/startup.log & cron && apache2-foreground

Learn about when to use ENTRYPOINT vs CMD.