web-dev-qa-db-ja.com

非rootユーザーとしてCronを使用してアクセス可能なボリュームにファイルを書き込むAlpineイメージのアクセス許可を修正する方法

コンテナの外部からアクセス可能なボリュームに書き込む非rootcrontabを実行するだけのマルチステージビルドインDockerを作成しようとしています。パーミッションには、ボリュームの外部アクセスとcronの2つの問題があります。

  1. dockerfileの最初のビルドでは、entry-pointおよびsu-execを使用してroot以外のユーザーイメージを作成します。ボリュームで権限を修正するのに役立ちます。

  2. 同じdockerfileの2番目のビルドでは、最初のイメージを使用して、通常は/ backupフォルダーに書き込むcrondプロセスを実行しました。

Dockerfileをビルドするためのdocker-compose.ymlファイル:

version: '3.4'
services:
  scrap_service:
        build: .
        container_name: "flight_scrap"
        volumes:
          - /home/rey/Volumes/mongo/backup:/backup

DockerFile(1)の最初のステップでは、 denis bertovicによる回答 をAlpineイメージに適合させようとします。

############################################################
# STAGE 1
############################################################

# Create first stage image
FROM gliderlabs/Alpine:Edge as baseStage

RUN echo http://nl.alpinelinux.org/Alpine/Edge/testing >> /etc/apk/repositories
RUN apk add --update && apk add -f gnupg ca-certificates curl dpkg su-exec shadow

COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh

# ADD NON ROOT USER, i hard fix value to 1000, my current id 
RUN addgroup scrapy \
    && adduser -h /home/scrapy -u 1000 -S -G scrapy scrapy

ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]

権限を修正するための私のdocker-entrypoint.shは次のとおりです。

#!/usr/bin/env bash
chown -R scrapy .
exec su-exec scrapy "$@"

第2段階(2)cronサービスを実行して、ボリュームとしてマウントされた/ backupフォルダーに書き込みます

############################################################
# STAGE 2
############################################################

FROM baseStage
MAINTAINER rey 

ENV TZ=UTC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apk add busybox-suid
RUN apk add -f tini bash build-base curl

# CREATE FUTURE VOLUME FOLDER WRITEABLE BY SCRAPY USER
RUN mkdir /backup && chown scrapy:scrapy /backup

# INIT NON ROOT USER CRON CRONTAB

COPY crontab /var/spool/cron/crontabs/scrapy
RUN chmod 0600 /var/spool/cron/crontabs/scrapy
RUN chown scrapy:scrapy /var/spool/cron/crontabs/scrapy

RUN touch /var/log/cron.log
RUN chown scrapy:scrapy /var/log/cron.log

# Switch to user SCRAPY already created in stage 1
WORKDIR /home/scrapy
USER scrapy

# SET TIMEZONE https://serverfault.com/questions/683605/docker-container-time-timezone-will-not-reflect-changes

VOLUME /backup

ENTRYPOINT ["/sbin/tini"]
CMD ["crond", "-f", "-l", "8", "-L", "/var/log/cron.log"]

通常、テストファイルを/backupボリュームフォルダに作成するcrontabファイル:

* * * * * touch /backup/testCRON

デバッグフェーズ:

  • Bashで私の画像にログインします。画像はscrapyユーザーを正しく実行しているようです:

    uid=1000(scrapy) gid=1000(scrapy) groups=1000(scrapy)
    
  • crontab -eコマンドも正しい情報を提供します

  • しかし、最初のエラーcronが正しく実行されない、i cat /var/log/cron.log iに許可拒否エラー

    crond: crond (busybox 1.27.2) started, log level 8
    crond: root: Permission denied
    crond: root: Permission denied
    
  • コマンドtouch /backup/testFileを使用して/ backupフォルダーに直接書き込もうとすると、秒のエラーも発生します。 /backupボリュームフォルダには、引き続きroot権限を使用してのみアクセスできます。理由はわかりません。

6
reyman64

説明されているように、crondまたはcronをルートとして使用する必要があります この回答では

代わりにチェックアウト aptible/supercronic crontab互換のジョブランナーで、コンテナで実行するように特別に設計されています。作成したすべてのユーザーに対応します。

4
VonC