在Postgres docker容器中启动系统服务



我想扩展postgres:10.2Dockerfile,以便添加一个cron作业,在特定日期执行一些SQL查询:

FROM postgres:10.2
COPY task-purge.sh /usr/local/share/
RUN chown postgres:postgres /usr/local/share/task-purge.sh
RUN chmod 700 /usr/local/share/task-purge.sh
COPY query-task-purge.sql /usr/local/share/
RUN chown postgres:postgres /usr/local/share/query-task-purge.sql
RUN chmod 700 /usr/local/share/query-task-purge.sql

问题是:cron服务没有启动:

docker容器内部:

root@5c17ce88c333:/# service cron status
[FAIL] cron is not running ... failed!
root@5c17ce88c333:/# pgrep cron
root@5c17ce88c333:/# 

我很难启动它…

在Dockerfile中,我尝试了:

  • 添加RUN service cron start:无变化
  • 添加CMD service cron start:容器启动时,以Starting periodic command scheduler: cron结束,不启动DB。
  • 添加CMD postgres && service cron start:当容器启动时,它以"root" execution of the PostgreSQL server is not permitted.结束,而不启动DB。
  • 添加一个类似https://docs.docker.com/config/containers/multi-service_container/:的wrappere CMD脚本。
  • 添加ENTRYPOINT "docker-entrypoint.sh" && service cron start: idem
  • 在新的docker-entrypoint.sh中添加service cron start(从官方postgres修改:10.2 Dockerfile https://hub.docker.com/layers/postgres/library/postgres/10.2/images/sha256-4b6b7bd361a3b7b69531b2c16766a38b0f3a89e9243f5a49ff16180dd2d42273?context=explore):Starting periodic command scheduler: croncron: can't open or create /var/run/crond.pid: Permission denied failed!
  • update-rc.d cron defaults && update-rc.d cron enable添加到docker-entrypoint.sh:没有变化。
  • 添加set -- su-exec root:root /bin/bash -c "service cron start": nothing change
  • 添加set -- su-exec root:root /bin/bash -c "update-rc.d cron defaults && update-rc.d cron enable": nothing change
  • 添加gosu root:root /bin/bash -c "service cron start":容器以error: failed switching to "root:root": operation not permitted.
  • 结尾
  • 添加exec gosu root:root /bin/bash -c "service cron start":容器以Starting periodic command scheduler: cron.
  • 结尾

你知道如何在postgres启动之前运行系统服务吗?我想扩展postgres:10.2.

谢谢!

好了,我明白为什么…我回答我自己的问题来帮助大家:docker-entrypoint.sh脚本运行exec gosu postgres "$BASH_SOURCE" "$@"命令(即使在最后的postgres版本:https://github.com/docker-library/postgres/blob/master/docker-entrypoint.sh),再次调用这个脚本,但作为postgres用户。

所以所有的系统操作都需要在这个命令之前执行。

例如:编写一个名为system_configure的函数,并在该行之前调用它:
# ... (outside main)
system_configure() {
echo "[x] Crontab service start ..."
service cron start
echo "[x] Crontab service started"
}
# ... (inside main function path)
system_configure
exec gosu postgres "$BASH_SOURCE" "$@"
# ... (end main)

你也可以使用其他docker镜像,比如ubuntu和superord,但是出于安全考虑,我更喜欢使用分布式镜像。

只需在Dockerfile中使用:

RUN service cron start

最新更新