Dockerize``在''调度程序

时间:2019-12-02 18:10:12

标签: docker

我想将at守护程序(atd)放在单独的docker容器中,以作为独立于外部环境的调度程序服务运行。

我可以在atdDockerfile之后运行docker-compose.yml

$ cat Dockerfile
FROM alpine
RUN apk add --update at ssmtp mailx
CMD [ "atd", "-f" ]
$ cat docker-compose.yml
version: '2'
services:
    scheduler:
        build: .
        working_dir: /mnt/scripts
        volumes:
          - "${PWD}/scripts:/mnt/scripts"

但是问题是:

1)没有内置选项可将atd日志重新定向到/proc/self/fd/1,以通过docker logs命令显示它们。 at仅具有-m选项,该选项将邮件发送给用户。 是否可以将at从用户邮件重定向到/proc/self/fd/1(也许有一些编译标志)?

2)现在,我通过docker-compose exec scheduler at -f test.sh now + 1 minute之类的命令添加新任务。这是个好方法吗?我认为一种更好的方法是找到一个文件,其中at存储一个队列,将该文件添加为卷,在外部进行更新,并在文件更改后仅发送docker restart。 但是我找不到at在高山linux上的数据存储位置(我just found /var/spool/atd/.SEQ在哪里存储上一份作业的ID)。有人知道at在哪里存储数据吗?

也很高兴听到有关at dockerization的任何建议。

UPD 。我发现at的数据存储在高山的/var/spool/atd文件夹中。当我通过at命令创建任务时,它将在此处创建名称为a000040190a2ff且内容为

的可执行文件
#!/bin/sh
# atrun uid=0 gid=0
# mail root 1
umask 22
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH
HOSTNAME=e605e8017167; export HOSTNAME
HOME=/root; export HOME
cd /mnt/scripts || {
     echo 'Execution directory inaccessible' >&2
     exit 1
}
#!/usr/bin/env sh
echo "Hello world"

UPD2 :运行at与不使用-m选项之间的区别是生成脚本的第三个字符串

带有-m选项:

#!/bin/sh
# atrun uid=0 gid=0
# mail root 1
...

没有-m

#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
...

根据official man

  

将向用户邮寄标准错误和他的标准输出   命令(如果有)。邮件将使用以下命令发送   / usr / sbin / sendmail

  

-m

     

作业完成后,即使没有邮件发送给用户   输出。

我尝试运行时间表简单的Hello World脚本,发现没有发送邮件:

# mail -u root
No mail for root

0 个答案:

没有答案