我必须安装hstore到docker postgres上 这是我在Shell中执行我的普通命令的需求
hstore
psql -d template1 -c 'create extension hstore';
如果我删除容器中的那行,它可以工作,但是我必须hstore自己执行安装,并且我必须告诉项目中的每个人都这样做,这不是一个好习惯
这是我的 yml file
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
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 安装? 我想制作图像并将其重新用于团队的整个项目
之所以失败是因为Postgres在构建期间没有在容器中运行,而是仅在CMD容器运行时才开始。
CMD
Docker映像的入口点脚本支持运行设置步骤- /docker-entrypoint-initdb.d容器启动时将执行目录中的任何.sql或.sh文件。
/docker-entrypoint-initdb.d
因此,您可以通过将扩展程序设置放入SQL脚本中并将该脚本复制到init目录的映像中来完成此操作:
> cat hstore.sql create extension hstore > cat Dockerfile FROM postgres:9.5 COPY hstore.sql /docker-entrypoint-initdb.d
构建该映像时,SQL脚本将在正确的位置执行,因此,每当从该映像运行容器时,它将安装扩展。