Docker中postgres:12和postgres:12-alpine的区别是什么?

23

Docker Hub 包含多个版本(标签)的Postgres数据库,例如:

  • 12.3、12和latest
  • 12.3-alpine、12-alpine和alpine -...

Postgres 版本12.3 和 12.3-alpine 之间有何区别?


1
如果您点击这些标签,您将看到底层的Dockerfile。一个基于debian,另一个基于alpine。 - chash
3个回答

24

Alpine是Linux的一个更小版本,使用它可以得到比完整的postgres镜像更小的容器。人们认为由于其体积较小,Alpine也更加安全。尽管Alpine的一个缺点是它比运行完整Linux操作系统的Docker镜像包含的功能要少得多。


为什么不总是使用alpine版本?!功能较少,但足以运行postgres。谁试图在镜像中运行其他东西?! - Alexis
5
这取决于个人喜好。我个人更喜欢尽可能在Alpine上运行,但有时可能会更加复杂,因为某些软件包可能会缺失,这会使得创建适当的Docker镜像更加困难。 - Saturnin Pugnet

13
  • postgres:12.3基于Debian
  • postgres:12.3-alpine基于Alpine

主要区别在于镜像大小和内容:

enter image description here


9

在选择数据库的Docker镜像时,您应该非常小心。事实上,Alpine和Debian中的PostgreSQL使用不同的排序规则。

一些Alpine镜像使用musl库版本(1.1.16),它不支持LC_COLLATE,因此尽管设置了LANG变量,数据排序仍将是按字节排序(C)。

LC_COLLATE应该添加到musl版本1.1.17中。

但这可能会带来灾难性的问题:一旦musl支持LC_COLLATE,所有Postgres VARCHAR索引都将被破坏。

请参阅更多讨论:

我自己试过:

FROM postgres:13-alpine

postgres=# select 'a' > 'A';
 ?column? 
----------
 t
(1 row)

postgres=# select 'a' < 'A';
 ?column? 
----------
 f
(1 row)

FROM postgres:13

postgres=# select 'a' > 'A';
 ?column? 
----------
 f
(1 row)

postgres=# select 'a' < 'A';
 ?column? 
----------
 t
(1 row)


2
请注意,现在有一个解决方法适用于 Postgres 15。请参见 https://github.com/docker-library/postgres/issues/1004#issuecomment-1280559846 和 https://github.com/docker-library/docs/blob/master/postgres/README.md#locale-customization。我刚刚使用 -e LANG=en-US.utf8 -e POSTGRES_INITDB_ARGS="--locale-provider=icu --icu-locale=en-US" 初始化了 postgres:15-alpine 并尝试了您的示例 select 'a' > 'A'select 'a' < 'A' ,它确实按预期工作! - GG.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接