如何在docker上运行的postgres容器上安装postgis?

g2ieeal7  于 2023-06-29  发布在  Docker
关注(0)|答案(1)|浏览(310)

我是postgres扩展和docker的新手,我有一些关于如何在Docker上运行的postgres容器上设置它们的问题。我必须创建一个表格,它需要postgis提供的几何类型。我有一个docker-compose文件:

version: '3.8'
services:
  test-db:
    image: postgres
    restart: always
    ports:
      - '5434:5432'
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: testdb
    volumes:
      - ./database/postgres:/data

我的Dockerfile目前看起来像这样:

# Development Build
FROM node:12.18.3-alpine3.12 as builder
LABEL maintainer="person <person@person.com>"

RUN apk update && apk add --no-cache make git

WORKDIR /usr/src/app

ARG NPM_TOKEN

COPY package*.json ./
RUN true
COPY package-lock.json ./
RUN true
COPY .npmrc /root/.npmrc

RUN npm i && rm /root/.npmrc && npm run postinstall; exit 0

COPY . .

RUN npm run build:all

我也试着按照this教程,但当遇到错误的第5步。
我也试着遵循this Stackoverflow问题的第二个答案。但是当我尝试运行docker pull kartoza/postgis:image_version时,我得到了一个错误Error response from daemon: manifest for kartoza/postgis:image_version not found: manifest unknown: manifest unknown
如果我安装了postgis并在dockerfile和docker compose上定义了它,而其他人运行了我的代码,他们也需要下载postgis吗?

ioekq8ef

ioekq8ef1#

这是我的建议。

只支持PostgreSQL和Postgis

假设您在Linux或Mac上,使用mkdir gis创建一个名为gis的目录,并通过执行cd gis进入该目录。
创建名为Dockerfile.pg的文件。

from postgres
run apt-get update
run apt-get upgrade -y
run apt-get install postgis -y

创建一个名为gis.sh的文件,其中包含:

#!/bin/bash

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    create extension postgis;
EOSQL

创建名为docker-compose.yml的文件

version: '3.8'
services:
  gis:
    build:
      context: .
      dockerfile: Dockerfile.pg
    container_name: gis
    image: gis
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: test
      POSTGRES_DB: postgres
    volumes:
      - pg:/var/lib/postgresql/data
      - ./gis.sh:/docker-entrypoint-initdb.d/gis.sh
volumes:
  pg:

然后执行docker compose up -d
这将使用您的Dockerfile.pg来:

  • 构建postgres图像并称之为gis
  • 运行apt-get更新
  • 运行apt-get upgrade -y
  • 运行apt-get install postgis

它将创建一个容器并将其命名为gis
它将挂载一个名为pg的命名卷,以便您可以轻松识别该卷。
它将运行gis.sh,在登录PostgreSQL后,它将创建一个名为postgis的扩展。
执行docker image ls时,您将看到一个gis图像。
执行docker container ls时,它会显示运行的容器名。
您可以使用docker exec -it gis /bin/bash登录到容器,您将看到

% docker exec -it gis /bin/bash
root@d3bdba37a76b:/#

您可以通过执行以下操作来验证是否已添加扩展:

root@d3bdba37a76b:/# psql postgres postgres
psql (15.3 (Debian 15.3-1.pgdg120+1))
Type "help" for help.

postgres=# SELECT oid, extname, extversion FROM pg_extension;
  oid  | extname | extversion
-------+---------+------------
 13561 | plpgsql | 1.0
 16384 | postgis | 3.3.3
(2 rows)

postgres=# exit

使用完容器后,可以使用docker compose down -v删除容器。-v也将删除卷。

提示您的应用,如果您想与PostgreSQL沿着运行

虽然我不知道你的应用程序是如何工作的,但你可能想尝试这样做来打开你的数据库和应用程序。调整你认为合适的。
gis目录中,现在有3个文件:

  • Dockerfile.pg
  • gis.sh
  • docker-compose.yml

添加另一个名为Dockerfile的文件-这是您的应用程序的Dockerfile。

FROM node:12.18.3-alpine3.12 as builder
RUN apk update && apk add --no-cache make git
WORKDIR /usr/src/app
ARG NPM_TOKEN
COPY package*.json ./
RUN true
COPY package-lock.json ./
RUN true
COPY .npmrc /root/.npmrc
RUN npm i && rm /root/.npmrc && npm run postinstall; exit 0
COPY . .
RUN npm run build:all

将docker-compose.yml更改为:

version: '3.8'
services:
  gis:
    build:
      context: .
      dockerfile: Dockerfile.pg
    image: gis
    container_name: gis
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: test
      POSTGRES_DB: postgres
    volumes:
      - pg:/var/lib/postgresql/data
      - ./gis.sh:/docker-entrypoint-initdb.d/gis.sh
    ports:
      - "5434:5432"

  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: nodeapp
    container_name: nodeapp
    depends_on:
      - gis
    ports:
      - "4000:4000"

volumes:
  pg:

然后可以运行docker compose up -d并查看输出。
这里有一个博客可以帮助你:https://michalzalecki.com/docker-compose-for-nodejs-and-postgresql/

相关问题