【问题标题】:Extending docker official postgres image扩展 docker 官方 postgres 镜像
【发布时间】:2016-02-10 15:18:11
【问题描述】:

我正在尝试扩展官方 docker postgres 映像以安装自定义 python 模块,以便我可以通过 plpython3 存储过程使用它。

这是我的 dockerfile

FROM postgres:9.5
RUN apt-get update && apt-get install -y postgresql-plpython3-9.5 python3
ADD ./repsug/ /opt/smtnel/repsug/
WORKDIR /opt/smtnel/repsug/
RUN ["python3", "setup.py", "install"]
WORKDIR /

我的问题是:我需要在我的 Dockerfile 中添加 ENTRYPOINT 和 CMD 命令吗?还是它们是从基础映像“继承”的?

官方 readme.md 中的示例显示了一个仅更改语言环境的 Dockerfile,没有 ENTRYPOINT 或 CMD。

我还在自述文件中读到,我可以通过执行自定义 sh 和/或 sql 脚本来扩展图像。我应该使用此功能而不是创建自定义图像吗?在这种情况下,问题是我如何确保脚本在“安装时”只运行一次,而不是每次?我的意思是,如果数据库已经创建并填充,我不想覆盖它。

谢谢, 阿维尔

【问题讨论】:

  • 在我看来,ENTRYPOINT 和 CMD 是继承的,但是因为你只能有一个这样的命令,所以只有最后一个有效,所以如果你添加一个,它将是最后一个 CMD或ENTRYPOINT,它将被使用

标签: postgresql docker dockerfile


【解决方案1】:

如果您在 Dockerfile 中定义新的 ENTRYPOINT,它将覆盖继承的 ENTRYPOINT。因此,在这种情况下,Postgres 将无法自动初始化(除非您编写相同的 ENTRYPOINT)。

https://docs.docker.com/engine/reference/builder/#entrypoint

另外,官方的postgres镜像允许你在/docker-entrypoint-initdb.d文件夹中添加.sql/.sh文件,这样一旦数据库初始化就可以执行。

最后,如果您不希望 Postgres 删除您的数据,您可以在每个 docker run ... 命令中在 /var/lib/postgresql/data 文件夹和本地文件夹之间挂载一个卷以保留它们。

【讨论】: