Alpine LinuxのDockerコンテナでroot以外のユーザーとしてcronjobを実行する方法は?

Alpine LinuxのDockerコンテナでroot以外のユーザーとして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」エラーが発生します。 「このグループには操作は許可されません。」

root以外のユーザーとしてcronを実行できますか?どうすればいいですか?

ベストアンサー1

私にとっては、2つのことが効果的です。

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"]

これの利点は、監督者が常に実行している(または終了したコンテナ)2つのサービスを担当していますdocker logs

おすすめ記事