bash - 如何在容器启动时启动自定义脚本和 cron
问题描述
我为 cron 作业(脚本 backup.sh)创建了一个 docker 映像——它将文件复制到远程服务器进行备份。但首先 - 当容器启动时,我需要创建 ssh 密钥并将其添加到远程服务器上的 authorized_keys 中,这样我就可以通过 rsync 进行连接。
我不知道如何在容器启动时执行两项任务 - 启动脚本 authorize.sh 和 cron
我尝试在脚本 backup.sh 中调用 authorize.sh,但它总是在多个容器中同时被调用,并且这些 ssh 密钥相互覆盖,这就是为什么我需要在容器启动时执行它,而不是在 cron 内部脚本
我无法在映像构建时调用 dockerfile 中的脚本,因为远程服务器连接作为环境变量传递
我试过代替 CMD ['crond', '-f', '-d', '8'] 做 CMD ['authorize.sh', '-f', '-d', '8'] 和在授权脚本中添加 crond -f,但容器在完成 authorize.sh 后停止
Dockerfile
FROM alpine:3.6
RUN apk update; \
apk upgrade;
RUN apk add bash openssh-client sshpass rsync
RUN mkdir -p /var/export/
COPY backup.sh /usr/local/bin/backup.sh
RUN chmod +x /usr/local/bin/backup.sh
RUN echo '0 */8 * * * /usr/local/bin/backup.sh' > /etc/crontabs/root
WORKDIR /var/export/
CMD ["crond", "-f", "-d", "8"]
解决方案
这就是 Docker 的工作方式,当 CMD 命令完成时,容器将停止。
您可以添加某种loop
或某些命令,这些命令不会在您的authorize.sh
somthing 结束时完成,例如:
tail -f /dev/null