mirror of
https://github.com/willfarrell/docker-crontab.git
synced 2025-06-25 21:34:06 +02:00
Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
ac1760ce71 | |||
68fa96e2e8 | |||
b0f5681faf | |||
945357ce4a | |||
5d9d345dd5 | |||
5946f3545d | |||
46407e1e27 | |||
e3afe6c3e5 | |||
0a4e3f5753 | |||
71661b4971 | |||
cba3bcb0d0 |
@ -1,7 +1,7 @@
|
|||||||
FROM library/docker:stable
|
FROM library/docker:stable
|
||||||
|
|
||||||
ENV HOME_DIR=/opt/crontab
|
ENV HOME_DIR=/opt/crontab
|
||||||
RUN apk add --no-cache --virtual .run-deps bash jq \
|
RUN apk add --no-cache --virtual .run-deps gettext bash jq \
|
||||||
&& mkdir -p ${HOME_DIR}/jobs ${HOME_DIR}/projects \
|
&& mkdir -p ${HOME_DIR}/jobs ${HOME_DIR}/projects \
|
||||||
&& adduser -S docker -D
|
&& adduser -S docker -D
|
||||||
|
|
||||||
@ -11,4 +11,4 @@ ENTRYPOINT ["/docker-entrypoint"]
|
|||||||
HEALTHCHECK --interval=5s --timeout=3s \
|
HEALTHCHECK --interval=5s --timeout=3s \
|
||||||
CMD ps aux | grep '[c]rond' || exit 1
|
CMD ps aux | grep '[c]rond' || exit 1
|
||||||
|
|
||||||
CMD ["crond","-f"]
|
CMD ["crond", "-f", "-d", "6", "-c", "/etc/crontabs"]
|
||||||
|
16
README.md
16
README.md
@ -57,6 +57,7 @@ See [`config.sample.json`](https://github.com/willfarrell/docker-crontab/blob/ma
|
|||||||
## How to use
|
## How to use
|
||||||
|
|
||||||
### Command Line
|
### Command Line
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker build -t crontab .
|
docker build -t crontab .
|
||||||
docker run -d \
|
docker run -d \
|
||||||
@ -67,7 +68,19 @@ docker run -d \
|
|||||||
crontab
|
crontab
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Use with docker-compose
|
||||||
|
|
||||||
|
1. Figure out which network name used for your docker-compose containers
|
||||||
|
* use `docker network ls` to see existing networks
|
||||||
|
* if your `docker-compose.yml` is in `my_dir` directory, you probably has network `my_dir_default`
|
||||||
|
* otherwise [read the docker-compose docs](https://docs.docker.com/compose/networking/)
|
||||||
|
2. Add `dockerargs` to your docker-crontab `config.json`
|
||||||
|
* use `--network NETWORK_NAME` to connect new container into docker-compose network
|
||||||
|
* use `--rm --name NAME` to use named container
|
||||||
|
* e.g. `"dockerargs": "--network my_dir_default --rm --name my-best-cron-job"`
|
||||||
|
|
||||||
### Dockerfile
|
### Dockerfile
|
||||||
|
|
||||||
```Dockerfile
|
```Dockerfile
|
||||||
FROM willfarrell/crontab
|
FROM willfarrell/crontab
|
||||||
|
|
||||||
@ -76,6 +89,7 @@ COPY config.json ${HOME_DIR}/
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Logrotate Dockerfile
|
### Logrotate Dockerfile
|
||||||
|
|
||||||
```Dockerfile
|
```Dockerfile
|
||||||
FROM willfarrell/crontab
|
FROM willfarrell/crontab
|
||||||
|
|
||||||
@ -87,13 +101,13 @@ CMD ["crond", "-f"]
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Logging - In Dev
|
### Logging - In Dev
|
||||||
|
|
||||||
All `stdout` is captured, formatted, and saved to `/var/log/crontab/jobs.log`. Set `LOG_FILE` to `/dev/null` to disable logging.
|
All `stdout` is captured, formatted, and saved to `/var/log/crontab/jobs.log`. Set `LOG_FILE` to `/dev/null` to disable logging.
|
||||||
|
|
||||||
example: `e6ced859-1563-493b-b1b1-5a190b29e938 2017-06-18T01:27:10+0000 [info] Start Cronjob **map-a-vol** map a volume`
|
example: `e6ced859-1563-493b-b1b1-5a190b29e938 2017-06-18T01:27:10+0000 [info] Start Cronjob **map-a-vol** map a volume`
|
||||||
|
|
||||||
grok: `CRONTABLOG %{DATA:request_id} %{TIMESTAMP_ISO8601:timestamp} \[%{LOGLEVEL:severity}\] %{GREEDYDATA:message}`
|
grok: `CRONTABLOG %{DATA:request_id} %{TIMESTAMP_ISO8601:timestamp} \[%{LOGLEVEL:severity}\] %{GREEDYDATA:message}`
|
||||||
|
|
||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
- [ ] Have ability to auto regenerate crontab on file change (signal HUP?)
|
- [ ] Have ability to auto regenerate crontab on file change (signal HUP?)
|
||||||
- [ ] Run commands on host machine (w/ --privileged?)
|
- [ ] Run commands on host machine (w/ --privileged?)
|
||||||
|
@ -22,16 +22,26 @@ CRONTAB_FILE=/etc/crontabs/docker
|
|||||||
# Ensure dir exist - in case of volume mapping
|
# Ensure dir exist - in case of volume mapping
|
||||||
mkdir -p ${HOME_DIR}/jobs ${HOME_DIR}/projects
|
mkdir -p ${HOME_DIR}/jobs ${HOME_DIR}/projects
|
||||||
|
|
||||||
# Create docker group using correct gid from host, and add docker user to it
|
ensure_docker_socket_accessible() {
|
||||||
if ! grep -q "^docker:" /etc/group; then
|
if ! grep -q "^docker:" /etc/group; then
|
||||||
|
# Ensure 'docker' user has permissions for docker socket (without changing permissions)
|
||||||
DOCKER_GID=$(stat -c '%g' ${DOCKER_SOCK})
|
DOCKER_GID=$(stat -c '%g' ${DOCKER_SOCK})
|
||||||
if [ "${DOCKER_GID}" != "0" ]; then
|
if [ "${DOCKER_GID}" != "0" ]; then
|
||||||
|
if ! grep -qE "^[^:]+:[^:]+:${DOCKER_GID}:" /etc/group; then
|
||||||
|
# No group with such gid exists - create group docker
|
||||||
addgroup -g ${DOCKER_GID} docker
|
addgroup -g ${DOCKER_GID} docker
|
||||||
adduser docker docker
|
adduser docker docker
|
||||||
else
|
else
|
||||||
|
# Group with such gid exists - add user "docker" to this group
|
||||||
|
DOCKER_GROUP_NAME=`getent group "${DOCKER_GID}" | awk -F':' '{{ print $1 }}'`
|
||||||
|
adduser docker $DOCKER_GROUP_NAME
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Docker socket belongs to "root" group - add user "docker" to this group
|
||||||
adduser docker root
|
adduser docker root
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
slugify() {
|
slugify() {
|
||||||
echo "$@" | iconv -t ascii | sed -r s/[~\^]+//g | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g | tr A-Z a-z
|
echo "$@" | iconv -t ascii | sed -r s/[~\^]+//g | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g | tr A-Z a-z
|
||||||
@ -40,7 +50,7 @@ slugify() {
|
|||||||
make_image_cmd() {
|
make_image_cmd() {
|
||||||
DOCKERARGS=$(echo ${1} | jq -r .dockerargs)
|
DOCKERARGS=$(echo ${1} | jq -r .dockerargs)
|
||||||
if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi
|
if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi
|
||||||
IMAGE=$(echo ${1} | jq -r .image)
|
IMAGE=$(echo ${1} | jq -r .image | envsubst)
|
||||||
TMP_COMMAND=$(echo ${1} | jq -r .command)
|
TMP_COMMAND=$(echo ${1} | jq -r .command)
|
||||||
echo "docker run ${DOCKERARGS} ${IMAGE} ${TMP_COMMAND}"
|
echo "docker run ${DOCKERARGS} ${IMAGE} ${TMP_COMMAND}"
|
||||||
}
|
}
|
||||||
@ -49,8 +59,9 @@ make_container_cmd() {
|
|||||||
DOCKERARGS=$(echo ${1} | jq -r .dockerargs)
|
DOCKERARGS=$(echo ${1} | jq -r .dockerargs)
|
||||||
if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi
|
if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi
|
||||||
SCRIPT_NAME=$(echo ${1} | jq -r .name)
|
SCRIPT_NAME=$(echo ${1} | jq -r .name)
|
||||||
|
SCRIPT_NAME=$(slugify $SCRIPT_NAME)
|
||||||
PROJECT=$(echo ${1} | jq -r .project)
|
PROJECT=$(echo ${1} | jq -r .project)
|
||||||
CONTAINER=$(echo ${1} | jq -r .container)
|
CONTAINER=$(echo ${1} | jq -r .container | envsubst)
|
||||||
TMP_COMMAND=$(echo ${1} | jq -r .command)
|
TMP_COMMAND=$(echo ${1} | jq -r .command)
|
||||||
|
|
||||||
if [ "${PROJECT}" != "null" ]; then
|
if [ "${PROJECT}" != "null" ]; then
|
||||||
@ -219,6 +230,8 @@ EOF
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ensure_docker_socket_accessible
|
||||||
|
|
||||||
if [ "$1" = "crond" ]; then
|
if [ "$1" = "crond" ]; then
|
||||||
if [ -f ${CONFIG} ]; then
|
if [ -f ${CONFIG} ]; then
|
||||||
build_crontab
|
build_crontab
|
||||||
|
Reference in New Issue
Block a user