уже пару дней пытаюсь создать простой докер, который использует cron для выполнения запланированного задания. Я прочитал почти все сообщения, найденные в Google, но все еще застрял.
Это мой Dockerfile:
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
RUN apt-get update
RUN apt-get clean # reduce image size
RUN apt-get install -yqq cron
COPY ["DockerWorkerServiceScheduledExecutable2/cron.allow", "/etc/"]
COPY ["DockerWorkerServiceScheduledExecutable2/mycronjob", "/etc/cron.d/"]
RUN sed -i 's/\r$//' /etc/cron.allow
RUN chown -R root:crontab /etc/cron.allow
RUN chmod 0644 /etc/cron.allow
RUN sed -i 's/\r$//' /etc/cron.d/mycronjob
RUN chmod 0644 /etc/cron.d/mycronjob
RUN crontab /etc/cron.d/mycronjob
RUN touch /var/log/cron.log
CMD /etc/init.d/crond start
CMD /etc/init.d/cron start && tail -f /var/log/cron.log
CMD /usr/sbin/cron -f
CMD cron
USER app
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["DockerWorkerServiceScheduledExecutable2/DockerWorkerServiceScheduledExecutable2.csproj", "DockerWorkerServiceScheduledExecutable2/"]
RUN dotnet restore "./DockerWorkerServiceScheduledExecutable2/./DockerWorkerServiceScheduledExecutable2.csproj"
COPY . .
WORKDIR "/src/DockerWorkerServiceScheduledExecutable2"
RUN dotnet build "./DockerWorkerServiceScheduledExecutable2.csproj" -c $BUILD_CONFIGURATION -o /app/build
CMD /etc/init.d/cron start && tail -f /var/log/cron.log
CMD /usr/sbin/cron -f
Это мой cron.allow, который я использовал, пытаясь зарегистрировать задание для пользователя «приложение» с помощью RUN crontab -u app /etc/cron.d/mycronjob
, но думаю, что он больше не нужен, учитывая, что я пытался зарегистрировать задание для пользователя root.
root
app
А это файл "mycronjob"
*/1 * * * * dotnet /app/bin/Debug/net8.0/DockerWorkerServiceScheduledExecutable2.dll >> /var/log/cron.log 2>&1
Последний — это Program.cs проекта DockerWorkerServiceScheduledExecutable2.
if (!File.Exists("myfile.txt"))
{
File.Create("myfile.txt").Close();
}
await File.AppendAllTextAsync("myfile.txt", "DoSomethingUseless: " + DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss") + System.Environment.NewLine + "\r\n");
Console.WriteLine("DoSomethingUseless: " + DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss"));
Я новичок в мире Linux и Docker, поэтому, вероятно, я напутал (уверен на 99%).
Основной эффект заключается в том, что если я проверю статус службы cron с помощью service cron status
, я получу сообщение «cron не запущен... сбой!»
Я знаю, что (вероятно) эти команды делают то же самое, но я не был уверен, какая из них правильная, какая строка правильная, и, в конце концов, ни одна из них, похоже, не работает :(
CMD /etc/init.d/crond start
CMD /etc/init.d/cron start && tail -f /var/log/cron.log
CMD /usr/sbin/cron -f
CMD cron
Может ли кто-нибудь помочь мне это исправить? Любая подсказка тоже будет оценена :) Как я уже сказал, изначально перепробовал почти все, что нашел в Google, мне бы хотелось, чтобы мое бесполезное сообщение было добавлено в файл.
Спасибо
Серджио
Я сделал шаг вперед, проблема, похоже, в "начальном изображении", извините, если я использую неправильное имя, но я не знаю, как его назвать:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
это мой новый Dockerfile, который почти делает то, что я хочу:
FROM ubuntu:latest
MAINTAINER [email protected]
RUN apt-get update && apt-get -y install cron && apt-get -y install dotnet8
# Copy hello-cron file to the cron.d directory
# COPY hello-cron /etc/cron.d/hello-cron
COPY ["DockerWorkerServiceScheduledExecutable3/mycronjob", "/etc/cron.d/mycronjob"]
RUN sed -i 's/\r$//' /etc/cron.d/mycronjob
# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/mycronjob
# Apply cron job
RUN crontab /etc/cron.d/mycronjob
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
# Run the command on container startup
# CMD cron && tail -f /var/log/cron.log
CMD service cron start && tail -f /var/log/cron.log
WORKDIR /app
# FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["DockerWorkerServiceScheduledExecutable3/DockerWorkerServiceScheduledExecutable3.csproj", "DockerWorkerServiceScheduledExecutable3/"]
RUN dotnet restore "./DockerWorkerServiceScheduledExecutable3/./DockerWorkerServiceScheduledExecutable3.csproj"
COPY . .
WORKDIR "/src/DockerWorkerServiceScheduledExecutable3"
RUN dotnet build "./DockerWorkerServiceScheduledExecutable3.csproj" -c $BUILD_CONFIGURATION -o /app/build
Теперь проблема в том, что cron не запускается автоматически, мне нужно запустить
service cron start
чтобы это работало
еще шаг :D чтобы cron запускался при запуске, мне пришлось создать файл «docker-compose.vs.debug.yml» в том же каталоге «docker-compose.yml» и добавить это:
version: '3.4'
services:
dockerworkerservicescheduledexecutable3:
image: ${DOCKER_REGISTRY-}dockerworkerservicescheduledexecutable3
build:
context: .
dockerfile: DockerWorkerServiceScheduledExecutable3/Dockerfile
entrypoint: sh -c '/etc/init.d/cron start && tail -f /var/log/cron.log'
таким образом, в режиме отладки он работает так, как и ожидалось. Теперь мне придется столкнуться с режимом Release