gpt4 book ai didi

python - Postgres 和 Docker 在文件更改时重新部署

转载 作者:行者123 更新时间:2023-11-29 12:16:21 25 4
gpt4 key购买 nike

我正在使用 Java/Postgres/Docker/Gradle 创建一个 Web 应用程序。我的项目是这样设置的:

有一个数据库容器和一个应用程序容器。应用程序容器只运行一个普通的 jar 文件。使用来自主机系统的卷添加 jar 文件。容器最初运行这个 jar 并监视它的变化。如果发生变化,它会重新部署 jar,使开发人员可以立即在本地机器上看到变化。这就像在 Tomcat 上部署/更新 war 文件。当您“按下按钮”时,实时应用程序会更新。无需停止应用程序、重建和重新运行:只需重建即可。

使用 Postgres Dockerhub 上的图像,我想做类似的事情:我想在 gradle 中“按下一个按钮”,这将更新数据库容器监控的一些文件并重新部署它。

不幸的是,我碰壁了。我最初的想法是创建一个扩展 Postgres 的 Dockerfile。它所要做的就是像往常一样运行 Postgres 服务并运行一个脚本来查找某些文件中的更改并重新部署。

不幸的是,以下 Dockerfile 失败了:

FROM postgres:9.4

WORKDIR /db
COPY monitor.py .
COPY run-pg-and-monitor.sh .

CMD ["run-pg-and-monitor.sh"]

shell脚本有以下命令:

# Run monitor in the background
python3 monitor.py &

# Run postgres normally
postgres

不幸的是,这不适用于 Postgres。我收到错误:

db_1       | "root" execution of the PostgreSQL server is not permitted.
db_1 | The server must be started under an unprivileged user ID to prevent
db_1 | possible system security compromise. See the documentation for
db_1 | more information on how to properly start the server.

如果我将命令设置为:

CMD ["postgres"]

这是 Postgres 容器最初所做的,错误消失了。显然,这不会运行我需要的 monitor.py。

奇怪的是,在没有方括号的情况下运行 CMD 也会导致此问题。

CMD postgres

从 shell 环境运行它也失败:

CMD ["sh", "-c", "postgres"]

也许这与从 shell 运行它有关...

我知道 postgres 应该从 postgres 用户而不是 root 运行。我觉得奇怪的是,如果我将 CMD 设置为:

CMD ["whoami"]

我得到:

db_1       | root

因此,它已经可以毫无问题地以 root 身份运行 postgres。

我的第二个想法是做一个 gradle 任务:

1) 更新触发应用程序容器重新部署的 jar

2) 运行 docker exec ... 以手动更新正在运行的数据库容器。

这个想法的唯一问题是,如果没有应用程序或数据库容器在运行,作业显然会失败。我将不得不添加逻辑来检查它们是否存在。这似乎并不理想。

有没有人有任何见解?是否有我不知道的解决方案?

最佳答案

这些奇怪的原因是 postgres Dockerfile 设置了它自己的 docker-entrypoint.sh脚本为 ENTRYPOINT对于图像。因此,在容器启动时,docker-entrypoint.sh 被执行,任何设置为 CMD 的内容都作为参数传递给脚本。

只有当第一个传递的参数等于 postgres(参见 herehere )时,入口脚本才会为 postgres 执行所需的初始化步骤,比如删除权限,然后最终简单地执行任何操作通过 CMD 传递。

覆盖 ENTRYPOINT 而不是 CMD,本质上是用你自己的脚本包装 docker-entrypoint.sh,应该会给你想要的行为:

# Run monitor in the background
python3 monitor.py &

# Run postgres normally
docker-entrypoint.sh "$@"

关于python - Postgres 和 Docker 在文件更改时重新部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52141654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com