如何修复使用 Cron 作为非 root 用户将文件写入可访问卷的 Alpine 图像权限

How to fix permissions for an Alpine image writing files using Cron as non root user into accessible volume

我正在尝试在 docker 中创建一个多阶段构建,它只是 运行 一个非根 crontab,它写入可从容器外部访问的卷。我有两个权限问题,卷外部访问和 cron:

  1. docker文件中的第一个构建创建了一个非 root 用户映像 entry-pointsu-exec 有用 修复权限带卷!

  2. 同一个 docker 文件中的第二个构建将第一个映像用于 运行 通常写入 /backup 文件夹的 crond 进程。

用于构建 docker 文件的 docker-compose.yml 文件:

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

DockerFile第一步(一),我尝试the answer given by 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)运行cron服务写入/backup文件夹挂载为volume

############################################################
# 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

调试阶段:

crondcron 应该用作 root,如 in this answer.

所述

改为查看 aptible/supercronic,一个与 crontab 兼容的作业 运行ner,专为容器中的 运行 而设计。它将容纳您创建的任何用户。