Alpine Linux의 Docker 컨테이너에서 루트가 아닌 사용자로 cronjob을 실행하는 방법은 무엇입니까?

Alpine Linux의 Docker 컨테이너에서 루트가 아닌 사용자로 cronjob을 실행하는 방법은 무엇입니까?

PHP-FPM Alpine Linux 이미지를 사용하여 Dockerfile을 사용하여 컨테이너를 구축했습니다. 이 컨테이너 내에서 정기적으로 크론 작업을 실행해야 합니다. 응용 프로그램 파일을 해당 /var/www디렉터리에 복사한 후 사용자 그룹과 사용자 www를 만든 다음 해당 사용자로 전환합니다. 진입점 스크립트에서 명령을 사용하여 crond를 시작합니다 crond -fbS -d 8 -L. 그런 다음 docker-entrypoint를 PHP-FPM으로 추가했습니다. 명령을 실행하려고 하는데

* * * * * php /var/www/artisan schedule:run >> /tmp/mycommand.log 2>> /var/tmp/cronjob.log

예정된 작업으로. 그리고 하나를 startup_script.sh진입점으로 삼으세요. 아래는 내 Dockerfile입니다.

FROM php:7.3-fpm-alpine
RUN mkdir -p /etc/cron.d
WORKDIR /var/www

RUN apk update && apk add \
 rsyslog\
 openrc \
 busybox-suid \
 postgresql-dev \
 build-base \
 freetype-dev \
 libjpeg-turbo-dev \
 libpng-dev \
 libzip-dev \
 zip \
 jpegoptim optipng pngquant gifsicle \
 vim \
 unzip \
 git \
curl \
busybox-initscripts
RUN docker-php-ext-install pdo_pgsql pdo_mysql mbstring zip exif 
 pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype- 
 dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png- 
 dir=/usr/include/
RUN docker-php-ext-install gd



RUN addgroup -g 8877 -S www && \
 adduser -u 8877 -S www -G www

COPY /src/crontab /etc/crontabs/www
COPY /src/cron.allow /etc/cron.d
USER www

COPY --chown=www:www ./src /var/www


CMD ./start_script.sh

EXPOSE 9000

start_script.sh아래는 cronjob을 시작하는 내 것입니다 .

  #!/bin/sh

  # turn on bash's job control
  set -m
  # Start the primary process and put it in the background

  #php-fpm &
  #php artisan schedule:run

  echo "TEST" >> /var/tmp/cronjob.log
  crond -fbS -d 8 -L /var/tmp/cronjob.log &
  docker-php-entrypoint php-fpm
  # Start the helper process
  #php artisan migrate --force
  # the my_helper_process might need to know how to wait on the
  # primary process to start before it does its work and returns
  #su www
  #chown -R www:www /var/www/*

  # now we bring the primary process back into the foreground
  # and leave it there
  fg %1

Docker 컨테이너는 완벽하게 빌드되고 실행되지만 cron이 crontab에서 cronjob을 실행하려고 하면 "root:permission received" 오류가 발생합니다. 및 "이 그룹에는 작업이 허용되지 않습니다."

루트가 아닌 사용자로 cron을 실행할 수 있습니까? 어떻게 해야 합니까?

답변1

나에게는 두 가지가 효과적입니다.

a) /etc/crontabs에 있는 www의 crontab 파일은 루트가 소유해야 합니다. 그런 다음 이 CMD는 cron과 PHP를 실행합니다.

CMD crond -l 0 && php-fpm

단점은 내가 거기에 없다는 것이다 docker logs.

b) Supervisor를 사용하여 cron, php-fpm(제 경우에는 NGINX)과 같은 단일 컨테이너에서 여러 서비스를 실행합니다(이것매우 도움이 됨):

다음은 귀하에게도 도움이 될 수 있는 Supervisord.conf 파일입니다.

[supervisord]
nodaemon=true

[program:php]
command=php-fpm -F
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
stderr_logfile=/dev/fd/2
stderr_logfile_maxbytes=0

[program:cron]
command=crond -l 0 -f
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
stderr_logfile=/dev/fd/2
stderr_logfile_maxbytes=0

Dockerfile 추출:

RUN apk --update upgrade && apk update && apk add supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

이것의 이점은 감독자가 항상 실행 중인(또는 종료된 컨테이너) 두 서비스를 담당하고 나도 docker logs.

관련 정보