如何在容器内创建PostgreSQL扩展?

27

我需要在我的Docker Postgres中安装hstore

以下是我用于执行此操作的标准命令:

psql -d template1 -c 'create extension hstore';
如果我删除容器中的那行代码,它可以正常工作,但我必须自己执行“hstore”安装并告诉项目中的每个人这样做,这不是一个好的做法。
这是我的yml文件。
  postgres:
    build:
      context: .
      dockerfile: dockerfiles/devdb.dockerfile
    environment:
      POSTGRES_USER: uih
      POSTGRES_PASSWORD: uIhbod!
      POSTGRES_DB: uih_portal
    ports:
        - "5433:5432"

以下是我的Docker文件 devdb.dockerfile

FROM postgres:9.5

RUN mkdir -p /var/lib/postgresql-static/data
ENV PGDATA /var/lib/postgresql-static/data

# psql -d template1 -c 'create extension hstore;'
CMD ["psql", "-d", "template1", "-c", "'create extension hstore;'"]

RUN echo "hstore extension installed"

编译后无法运行

$ docker-compose up postgres
Recreating uihportal_postgres_1
Attaching to uihportal_postgres_1
postgres_1       | psql: could not connect to server: No such file or directory
postgres_1       |      Is the server running locally and accepting
postgres_1       |      connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
uihportal_postgres_1 exited with code 2

问题:

如何从dockerfile安装hstore
我想创建一个镜像并在我的团队整个项目中重复使用它。

1个回答

37

由于在构建期间容器中的Postgres没有运行,只有当容器运行时才会启动CMD

Docker镜像的入口脚本支持运行设置步骤 - 在/docker-entrypoint-initdb.d目录中的任何.sql或.sh文件都将在容器启动时执行。

因此,您可以将扩展设置放在SQL脚本中,并将该脚本复制到init目录下的映像中:

> cat hstore.sql
create extension hstore
> cat Dockerfile
FROM postgres:9.5
COPY hstore.sql /docker-entrypoint-initdb.d
当您构建该映像时,SQL脚本将位于正确的位置以便执行,因此,每当容器从该映像运行时,它都会安装该扩展。

谢谢您的回复。我会尽快回到电脑前。我正在回家的路上。 - joe
谢谢你,Elton。我花了很长时间才理解你的回答。我是 Docker 的新手。 - joe
3
如果您在compose中通过环境变量指定数据库,则此方法实际上不起作用。docker-entrypoint-initdb.d文件在CREATE DATABASE之后运行,因此它只会安装在模板(我猜)数据库上,而不是您想要的那个。我还没想出如何解决这个问题,除非在sql文件中实际指定数据库名称。编辑:尽管我刚刚重新审查了Docker镜像,并将--dbname传递给psql,所以我不确定。 - dannosaur

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