gpt4 book ai didi

postgresql - 为什么 postgres 官方 docker repo 在构建时不启动数据库服务?

转载 作者:行者123 更新时间:2023-11-29 11:59:42 24 4
gpt4 key购买 nike

https://github.com/docker-library/postgres背景下(github repo )和 https://registry.hub.docker.com/_/postgres/ ( docker 枢纽)

可以看出数据库是由Entrypoint和CMD用bash脚本启动的

/docker-entrypoint.sh

ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 5432
CMD ["postgres"]

另一个用于更改数据库的脚本 Hook 是

/docker-entrypoint-initdb.d

这意味着数据库仅在运行时启动(可以是 pqsl),当输入 docker run 命令时。

这会导致问题,我们无法在数据库在构建时运行之前对其进行自定义,例如添加扩展并用数据填充数据库。

当然,它可以在运行时完成。但它的优点是每次运行图像时都重复操作。

那么,从 docker 或 postgres 的角度来看,这种设计背后的逻辑是什么?我如何在构建时添加扩展和填充数据?

最佳答案

如果您要在构建时自定义(创建、填充数据)数据库,这意味着数据库数据会写入 docker 镜像文件系统本身(因为不能在构建时装载卷)。

问题是 docker 镜像文件系统是一个特殊的文件系统(AUFSbtrfs 等),它不能为数据库服务器等数据密集型应用程序提供良好的 I/O 性能。

因此,您希望将数据写入卷而不是 docker 容器文件系统。由于您在构建时不知道运行时使用的卷是什么,并且无论如何都无法在构建时挂载卷,因此任何人都不应该在构建时创建数据库。

此外,如果您仔细查看 Dockerfile在官方 PostgreSQL 图像中,您会看到有一个 VOLUME使写入数据的路径成为卷的指令。这意味着图像的设计使得数据永远不会到达 docker 容器文件系统。

如果您查看其他数据库或数据密集型应用程序的其他 Dockerfile,您会注意到它们都是以这种方式运行的。另一个原因是它被接受为 good practice。使您的 docker 容器不可变。

如果你想在你的镜像中安装额外的模块,只要它们不依赖于将写入卷的数据就可以了,只要你确保为它们将要写入的任何路径声明一个卷写入数据。


tl;dr

应用程序代码/二进制 → docker 镜像文件系统

应用程序数据 → docker volume

关于postgresql - 为什么 postgres 官方 docker repo 在构建时不启动数据库服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31819665/

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