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

时间:2021-03-04 10:54:15

标签: linux bash postgresql docker cron

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

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结尾,不启动数据库。
  • 添加CMD postgres && service cron start:容器启动时以"root" execution of the PostgreSQL server is not permitted.结尾,不启动数据库。
  • 添加像 https://docs.docker.com/config/containers/multi-service_container/ 这样的包装 CMD 脚本:相同的行为。
  • 添加 ENTRYPOINT "docker-entrypoint.sh" && service cron start:同上
  • 在新的 service cron start 中添加 docker-entrypoint.sh(从官方 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":没有任何变化
  • 添加set -- su-exec root:root /bin/bash -c "update-rc.d cron defaults && update-rc.d cron enable":没有任何变化
  • 添加 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。

谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我明白为什么......我回答我自己的问题来帮助大家: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 和 supervisord,但出于安全原因,更喜欢 distroless 镜像。

相关问题