[英]Start a system service in the Postgres docker container
我想扩展postgres:10.2
Dockerfile 以添加一个 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
结束而不启动数据库。CMD postgres && service cron start
:当容器启动时,它以"root" execution of the PostgreSQL server is not permitted.
无需启动数据库。ENTRYPOINT "docker-entrypoint.sh" && service cron start
:同上service cron start
in a new docker-entrypoint.sh
(modified from the official postgres:10.2 Dockerfile https://hub.docker.com/layers/postgres/library/postgres/10.2/images/sha256-4b6b7bd361a3b7b69531b2c16766a38b0f3a89e9243f5a49ff16180dd2d42273?context=探索): 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。
谢谢 !
好的,我明白为什么......我回答我自己的问题来帮助大家: docker-entrypoint.sh
脚本运行exec gosu postgres "$BASH_SOURCE" "$@"
命令(即使在最后一个 postgres 版本中: https:/ /github.com/docker-library/postgres/blob/master/docker-entrypoint.sh )再次调用此脚本,但作为postgres
用户。
所以每一个系统操作都需要在这个命令之前执行。
例如:编写一个名为system_configure
的 function 并在该行之前调用它:
# ... (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 映像与 supervisord 一起使用,例如 ubuntu,但出于安全原因更喜欢 distroless 映像。
只需在您的Dockerfile
中使用以下命令运行一次:
RUN service cron start
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.