如何修复使用 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:
docker文件中的第一个构建创建了一个非 root 用户映像 entry-point
和 su-exec
有用 修复权限带卷!
同一个 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
调试阶段:
使用 bash 登录我的图像,图像似乎正确 运行 scrapy 用户:
uid=1000(scrapy) gid=1000(scrapy) groups=1000(scrapy)
crontab -e
命令也给出了正确的信息
但是 第一个错误,cron 没有 运行 正确,当我 cat /var/log/cron.log
我有一个 权限被拒绝的错误
crond: crond (busybox 1.27.2) started, log level 8
crond: root: Permission denied
crond: root: Permission denied
当我尝试使用命令 touch /backup/testFile
直接写入 /backup 文件夹时,我还有一个 第二个错误 。 /backup
卷文件夹仍然只能使用 root 权限访问,不知道为什么。
crond
或 cron
应该用作 root,如 in this answer.
所述
改为查看 aptible/supercronic
,一个与 crontab 兼容的作业 运行ner,专为容器中的 运行 而设计。它将容纳您创建的任何用户。
我正在尝试在 docker 中创建一个多阶段构建,它只是 运行 一个非根 crontab,它写入可从容器外部访问的卷。我有两个权限问题,卷外部访问和 cron:
docker文件中的第一个构建创建了一个非 root 用户映像
entry-point
和su-exec
有用 修复权限带卷!同一个 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
调试阶段:
使用 bash 登录我的图像,图像似乎正确 运行 scrapy 用户:
uid=1000(scrapy) gid=1000(scrapy) groups=1000(scrapy)
crontab -e
命令也给出了正确的信息但是 第一个错误,cron 没有 运行 正确,当我
cat /var/log/cron.log
我有一个 权限被拒绝的错误crond: crond (busybox 1.27.2) started, log level 8 crond: root: Permission denied crond: root: Permission denied
当我尝试使用命令
touch /backup/testFile
直接写入 /backup 文件夹时,我还有一个 第二个错误 。/backup
卷文件夹仍然只能使用 root 权限访问,不知道为什么。
crond
或 cron
应该用作 root,如 in this answer.
改为查看 aptible/supercronic
,一个与 crontab 兼容的作业 运行ner,专为容器中的 运行 而设计。它将容纳您创建的任何用户。