postgresql:alpine docker 容器中的 Cron
Cron in postgresql:alpine docker container
我正在使用 "plain" postgresql:alpine docker 图像,但必须每天安排一次数据库备份。我认为这是一个很常见的任务。
我创建了一个脚本 backup
并存储在 /etc/periodic/15min
的容器中,并使其可执行:
bash-4.4# ls -l /etc/periodic/15min/
total 4
-rwxr-xr-x 1 root root 95 Mar 2 15:44 backup
我尝试手动执行它,效果很好。
我的问题是自动将 crond
转换为 运行。
如果我执行 docker exec my-postgresql-container crond
,守护进程启动并且 cron 工作,但是 我想将它嵌入我的 Dockerfile
FROM postgres:alpine
# my backup script, MUST NOT have .sh extension
COPY backup.sh /etc/periodic/15min/backup
RUN chmod a+x /etc/periodic/15min/backup
RUN crond # <- doesn't work
我不知道如何重写或覆盖官方镜像中的命令。出于更新原因,如果可能的话,我也想保留这些图片。
几个月前我遇到了完全相同的问题。关键方面是一个容器只能有一个由 ENTRYPOINT
and/or CMD
定义的主进程 Dockerfile
.
您不能只将 postgres
换成 crond
,否则您的数据库不是 运行ning。通常建议通过每个容器使用一项服务来分隔关注区域。
考虑到这一点,要么使用一个单独的容器,它 运行 只不过是 crond
,因此 Docker
既可以跟踪它的生命周期,又可以重新启动它 when/if失败,机器重启等
或 运行 使用 docker exec
在您的主机上通过 cron
的作业。
第三个也是我认为最好(但也是先进)的解决方案是 pg_cron
。它是一个 postgres
扩展,因此 运行 作业在同一个数据库容器中。您的挑战是调整它的配置和安装。
最简单的部分应该是
postgresql.conf
:
# add to postgresql.conf:
shared_preload_libraries = 'pg_cron'
cron.database_name = 'postgres'
接下来,您需要通过调整 Dockerfile
将 pg_cron
扩展名添加到您的图像中,您可以从官方 alpine postgres
图像中获取它。 here.
描述了它的安装
Note: This option if you would like to use the same container with multiple service
安装 Supervisord,这将使您能够 运行 crond
和 postgresql
。 Dockerfile
将如下所示:
FROM postgres:alpine
RUN apk add --no-cache supervisor
RUN mkdir /etc/supervisor.d
COPY postgres_cron.ini /etc/supervisor.d/postgres_cron.ini
ENTRYPOINT ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
而postgres_cron.ini
则如下:
[supervisord]
logfile=/var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
loglevel=info ; (log level;default info; others: debug,warn,trace)
nodaemon=true ; (start in foreground if true;default false)
[program:postgres]
command=/usr/local/bin/docker-entrypoint.sh postgres
autostart=true
autorestart=true
[program:cron]
command =/usr/sbin/crond -f
autostart=true
autorestart=true
然后您可以开始 docker 构建过程并从您的新映像 运行 一个容器。根据需要随意修改 Dockerfile
或 postgres_cron.ini
我正在使用 "plain" postgresql:alpine docker 图像,但必须每天安排一次数据库备份。我认为这是一个很常见的任务。
我创建了一个脚本 backup
并存储在 /etc/periodic/15min
的容器中,并使其可执行:
bash-4.4# ls -l /etc/periodic/15min/
total 4
-rwxr-xr-x 1 root root 95 Mar 2 15:44 backup
我尝试手动执行它,效果很好。
我的问题是自动将 crond
转换为 运行。
如果我执行 docker exec my-postgresql-container crond
,守护进程启动并且 cron 工作,但是 我想将它嵌入我的 Dockerfile
FROM postgres:alpine
# my backup script, MUST NOT have .sh extension
COPY backup.sh /etc/periodic/15min/backup
RUN chmod a+x /etc/periodic/15min/backup
RUN crond # <- doesn't work
我不知道如何重写或覆盖官方镜像中的命令。出于更新原因,如果可能的话,我也想保留这些图片。
几个月前我遇到了完全相同的问题。关键方面是一个容器只能有一个由 ENTRYPOINT
and/or CMD
定义的主进程 Dockerfile
.
您不能只将 postgres
换成 crond
,否则您的数据库不是 运行ning。通常建议通过每个容器使用一项服务来分隔关注区域。
考虑到这一点,要么使用一个单独的容器,它 运行 只不过是 crond
,因此 Docker
既可以跟踪它的生命周期,又可以重新启动它 when/if失败,机器重启等
或 运行 使用 docker exec
在您的主机上通过 cron
的作业。
第三个也是我认为最好(但也是先进)的解决方案是 pg_cron
。它是一个 postgres
扩展,因此 运行 作业在同一个数据库容器中。您的挑战是调整它的配置和安装。
最简单的部分应该是
postgresql.conf
:
# add to postgresql.conf:
shared_preload_libraries = 'pg_cron'
cron.database_name = 'postgres'
接下来,您需要通过调整 Dockerfile
将 pg_cron
扩展名添加到您的图像中,您可以从官方 alpine postgres
图像中获取它。 here.
Note: This option if you would like to use the same container with multiple service
安装 Supervisord,这将使您能够 运行 crond
和 postgresql
。 Dockerfile
将如下所示:
FROM postgres:alpine
RUN apk add --no-cache supervisor
RUN mkdir /etc/supervisor.d
COPY postgres_cron.ini /etc/supervisor.d/postgres_cron.ini
ENTRYPOINT ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
而postgres_cron.ini
则如下:
[supervisord]
logfile=/var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
loglevel=info ; (log level;default info; others: debug,warn,trace)
nodaemon=true ; (start in foreground if true;default false)
[program:postgres]
command=/usr/local/bin/docker-entrypoint.sh postgres
autostart=true
autorestart=true
[program:cron]
command =/usr/sbin/crond -f
autostart=true
autorestart=true
然后您可以开始 docker 构建过程并从您的新映像 运行 一个容器。根据需要随意修改 Dockerfile
或 postgres_cron.ini