如何升级在 Docker 容器中运行的软件(例如 PostgreSQL)?

如何升级在 Docker 容器中运行的软件(例如 PostgreSQL)?

使用基础 PostgreSQL Docker 映像时,您可以选择 PostgreSQL 版本,启动容器并运行。太棒了!但是,将来升级到较新版本的 PostgreSQL 的正确/最佳方法是什么?

答案1

目前对此没有简单的解决方案,但我发现最简单的方法是使用pg_dump旧版本,然后将该转储加载到新版本中。

有很多讨论https://github.com/docker-library/postgres/issues/37关于此问题的可能解决方案,以及基于 docker 的升级概念验证https://github.com/tianon/docker-postgres-upgrade

答案2

在容器中运行 PostgreSQL 一年多之后,我倾向于认为数据库不太适合容器化,原因正是如此。容器并非旨在像虚拟机一样使用,因此,如果您试图将其视为您管理的虚拟机,工具的每个方面都会与您作对。容器就像美化的 chroot - 为特定应用程序提供隔离和可重现的环境,应用程序所需的配置越少越好。

综上所述,如果您坚持必须在容器中运行 PostgreSQL,那么至少应该从某个地方安装一个卷来放置数据文件,以便您可以安全地销毁或修改数据库服务器映像(例如 PostgreSQL 升级)。任何必须完成的配置都应该在 Dockerfile 中完成,以便升级也可以通过编辑 Dockerfile 来处理 - 例如,如果您正在进行小规模升级,您可能只需要更改FROMDockerfile 中映像的标签。

答案3

您只需指定一个标签,它对应于镜像中的 PostgreSQL 版本。您不应该在正在运行的容器中手动升级 PostgreSQL,因为这违背了使用基础镜像的目的。

Dockerfile使用FROM操作说明

FROM postgres:9.4

从命令行使用run命令

$ sudo docker run [OPTIONS] postgres:9.4 [COMMAND] [ARG...]

答案4

Github 问题链接A Lee在的回答中有一个Dirbaio使用命令进行评论对我来说效果很好:

docker exec postgres-old pg_dumpall -U postgres | docker exec -i postgres-new psql -U postgres

尽管我实际使用的命令是:

docker exec postgres-old pg_dumpall | docker exec -i postgres-new psql

.. 因为我使用的是 root 用户而不是postgres

Postgres 文档pg_dumpallhttps://www.postgresql.org/docs/12/app-pg-dumpall.html

相关内容