一尘不染

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

docker

我必须安装hstore到docker postgres上
这是我在Shell中执行我的普通命令的需求

psql -d template1 -c 'create extension hstore';

如果我删除容器中的那行,它可以工作,但是我必须hstore自己执行安装,并且我必须告诉项目中的每个人都这样做,这不是一个好习惯

这是我的 yml file

  postgres:
    build:
      context: .
      dockerfile: dockerfiles/devdb.dockerfile
    environment:
      POSTGRES_USER: uih
      POSTGRES_PASSWORD: uIhbod!
      POSTGRES_DB: uih_portal
    ports:
        - "5433:5432"

这是我的码头工人文件 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

题:

如何hstore从dockerfile 安装?
我想制作图像并将其重新用于团队的整个项目


阅读 341

收藏
2020-06-17

共1个答案

一尘不染

之所以失败是因为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脚本将在正确的位置执行,因此,每当从该映像运行容器时,它将安装扩展。

2020-06-17