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

时间:2018-01-10 13:09:59

标签: docker permissions cron dockerfile alpine

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

  1. dockerfile中的第一个版本使用entry-point创建一个非root用户图片,并使用su-exec 修复权限

  2. 同一个dockerfile中的第二个版本使用第一个图像来运行crond进程,该进程通常写入/ backup文件夹。

  3. 构建dockerfile的docker-compose.yml文件:

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

    在DockerFile(1)的第一步中,我尝试将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文件夹
    ############################################################
    # 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
    

    DEBUG阶段:

    • 使用bash登录我的图像,似乎图像正确运行了scrapy用户:

      uid=1000(scrapy) gid=1000(scrapy) groups=1000(scrapy)
      
    • crontab -e命令也提供了正确的信息

    • 但是第一次出错 cron没有正确运行,当我cat /var/log/cron.log我有权限被拒绝错误< / strong>

      crond: crond (busybox 1.27.2) started, log level 8
      crond: root: Permission denied
      crond: root: Permission denied
      
    • 当我尝试使用命令touch /backup/testFile直接写入/ backup文件夹时,我还有第二个错误/backup卷文件夹继续只能使用root权限访问,不知道原因。

1 个答案:

答案 0 :(得分:3)

crondcron应该用作root用户,如in this answer所述。

检查aptible/supercronic,这是一个兼容crontab的作业运行器,专门设计用于在容器中运行。它将容纳您创建的任何用户。