0%

执行命令的目录: /Volumes/data/jenkins/workspace/qa3

报错

1
2
3
Cloning into '/home/web/deployer/Foundation/qa3/default/releases/20191022203935'...
fatal: Unable to read current working directory: Permission denied
fatal: index-pack failed

解决方法: 进入到对应目录执行 clone

cd /home/web/deployer/Foundation/qa3/default/releases && git clone xxx 20191022203935

cron 文件

hello-cron

1
2
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# An empty line is required at the end of this file for a valid cron file.

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM ubuntu:latest
MAINTAINER docker@ekito.fr

RUN apt-get update && apt-get -y install cron

# Copy hello-cron file to the cron.d directory
COPY hello-cron /etc/cron.d/hello-cron

# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/hello-cron

# Apply cron job
RUN crontab /etc/cron.d/hello-cron

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

# Run the command on container startup
CMD cron && tail -f /var/log/cron.log

测试

script
1
2
docker build --rm -t ekito/cron-example .
docker run -it ekito/cron-example

说明

可以使用 cron -f 作为 dockerfile 的 CMD,这样会强制 crontab 前台运行

原文地址:

how-to-run-a-cron-job-inside-a-docker-container

依赖

pcntl 扩展

源码

signal.php

1
2
3
4
5
6
7
8
9
10
11
12
<?php

declare(ticks=1);

pcntl_signal(SIGUSR1, function () {
file_put_contents('signal_test.log', time() . PHP_EOL, FILE_APPEND);
});

while (true) {
sleep(1);
}

运行

查看进程 ID

1
ps aux | grep signal.php | grep -v grep

发送信号

假设进程 ID 是 12345

1
kill -SIGUSR1 12345

用处

可以让我们不重启 php 进程的同时做一些处理。

比如,接收到信号后从磁盘读取新的配置文件等。