내 목표는 crontab이 포함된 Docker 컨테이너를 실행하는 것입니다. 따라서 루트가 아닌 사용자로 예약된 crontab 작업을 실행할 수 있기를 원합니다. 다음 Docker 이미지를 실행하고 있습니다.
FROM openjdk:8
RUN apt-get update && apt-get -y install nano
RUN apt-get update && apt-get -y install cron
RUN service cron start # tried both
RUN cron # tried both
ENV TZ="Europe/Rome"
RUN useradd -u 8877 myuser
USER myuser
CMD ["tail", "-f", "/dev/null"]
Docker 스택에 배포합니다.
...
crontab:
image: reg/image
cap_drop:
- cap_dac_override
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: any
delay: 3s
window: 60s
placement:
constraints: [node.role == manager]
update_config:
delay: 2s
volumes:
- v:/my/vol
environment:
- PUID=8877
- PGID=8877
...
docker exec -it <id> bash
myuser로 컨테이너를 실행 하면 서비스 cron 상태가 실행되고 "cron is running"이 출력됩니다. 하지만 를 실행하면 crontab -e
내가 작성 중인 파일에 "기록 파일에 문제가 있습니다"라는 빨간색 오류 메시지가 표시됩니다. 저장하려고 하면 "No crontab for myuser - using 빈 원터치: '/home/myuser/.selected_editor'를 터치할 수 없습니다. 해당 파일 또는 디렉토리가 없습니다. /home/myuser/ 디렉토리를 생성할 수 없습니다. local/share/nano/: 검색 기록이나 커서 위치를 저장/로드하는 데 필요한 파일이나 디렉터리가 없습니다."
답변1
crontab의 사용을 제한하는 방법은 여러 가지가 있을 수 있습니다. 설치 방법은 crontab 맨페이지를 참조하세요.
가장 간단한 경우 제어는 /etc/cron.allow, /etc/cron.deny 파일을 통해 이루어집니다. 사용 규칙은 매우 구체적입니다.
- 두 파일 모두 존재하지 않으면 루트만 crontab을 실행할 수 있습니다.
- cron.allow가 존재하는 경우 crontab을 사용하려면 사용자 이름이 나열되어야 합니다.
- cron.deny의 모든 사용자를 금지합니다.
- cron.deny만 존재하는 경우 언급되지 않은 모든 사용자가 crontab을 사용할 수 있습니다.