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?
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
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í:
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: