Задание cron не запускается в моем контейнере Docker, запущенном Visual Studio

уже пару дней пытаюсь создать простой докер, который использует 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, мне бы хотелось, чтобы мое бесполезное сообщение было добавлено в файл.

Спасибо

Серджио

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я сделал шаг вперед, проблема, похоже, в "начальном изображении", извините, если я использую неправильное имя, но я не знаю, как его назвать:

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

Другие вопросы по теме