【发布时间】:2023-01-31 22:36:22
【问题描述】:
我正在(或计划)使用 Postgres 对 OpenStreetMaps 数据进行一些空间数据库处理。我正在使用 mac m1,并决定最好的方法是在 docker 容器中安装 PostGis 来运行 Postgres 数据库。我无法从我的主机连接,但我可以从添加在同一个 docker-compose 中的另一个容器连接。
为了设置数据库以导入 OSM 数据,我需要更改一些配置值,以及安装 PostGis。所以我编写了自己的 dockerfile 来在启动时完成这些任务。为此,我使用了两个 .sh 文件。这个 dockerfile 大部分工作正常,因为我可以从另一个运行 pgadmin4 的 docker 容器连接,但是我的后端应用程序、azure data studio 和来自终端的 psql 无法连接,得到 could not connect to server: Operation timed out Is the server running on host "172.31.0.2" and accepting TCP/IP connections on port 5432?。
我的假设是,当我运行 Postgres 容器时,我遗漏了或添加了不正确的东西,但谷歌搜索没有结果!任何帮助都会很棒。
码头工人组成
version: '3.8'
services:
db:
build:
./database
environment:
- POSTGRES_HOST_AUTH_METHOD=trust
ports:
- "5432:5432"
文件
FROM postgres:14-bullseye
LABEL maintainer="PostGIS Project - https://postgis.net"
ENV POSTGIS_MAJOR 3
ENV POSTGIS_VERSION 3.3.2+dfsg-1.pgdg110+1
RUN apt-get update \
&& apt-cache showpkg postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR \
&& apt-get install -y --no-install-recommends \
# ca-certificates: for accessing remote raster files;
# fix: https://github.com/postgis/docker-postgis/issues/307
ca-certificates \
\
postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR=$POSTGIS_VERSION \
postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR-scripts \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /docker-entrypoint-initdb.d
COPY ./initdb-postgis.sh /docker-entrypoint-initdb.d/10_postgis.sh
COPY ./update-postgis.sh /usr/local/bin
本质上是 postgis docker 镜像的副本,但它允许我在 initdb-postgis.sh 和 update-postgis.sh 文件中安装其他扩展,如下所示:
initdb-postgis.sh
#!/bin/sh
set -e
export PGUSER="$POSTGRES_USER"
"${psql[@]}" <<- 'EOSQL'
ALTER SYSTEM SET listen_addresses = '*';
ALTER SYSTEM SET wal_level = minimal;
ALTER SYSTEM SET max_wal_senders = 0;
ALTER SYSTEM SET checkpoint_timeout = '1d';
ALTER SYSTEM SET checkpoint_completion_target = 0.90;
ALTER SYSTEM SET shared_buffers = '8GB';
ALTER SYSTEM SET max_wal_size = '10GB';
ALTER SYSTEM SET min_wal_size = '1GB';
CREATE DATABASE template_postgis IS_TEMPLATE true;
EOSQL
for DB in template_postgis "$POSTGRES_DB"; do
echo "Loading PostGIS extensions into $DB"
"${psql[@]}" --dbname="$DB" <<-'EOSQL'
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS postgis_topology;
CREATE EXTENSION IF NOT EXISTS hstore;
EOSQL
done
更新-postgis.sh
#!/bin/sh
set -e
export PGUSER="$POSTGRES_USER"
POSTGIS_VERSION="${POSTGIS_VERSION%%+*}"
for DB in template_postgis "$POSTGRES_DB" "${@}"; do
echo "Updating PostGIS extensions '$DB' to $POSTGIS_VERSION"
psql --dbname="$DB" -c "
-- Upgrade PostGIS (includes raster)
CREATE EXTENSION IF NOT EXISTS postgis VERSION '$POSTGIS_VERSION';
ALTER EXTENSION postgis UPDATE TO '$POSTGIS_VERSION';
-- Upgrade Topology
CREATE EXTENSION IF NOT EXISTS postgis_topology VERSION '$POSTGIS_VERSION';
ALTER EXTENSION postgis_topology UPDATE TO '$POSTGIS_VERSION';
-- Upgrade hstore
CREATE EXTENSION IF NOT EXISTS hstore;
"
我正在使用 docker 检查容器 ID 时给出的 IP 从主机连接,因此 docker compose 网络应该不是问题。正如我之前提到的,从 docker compose 内部连接工作正常,pgadmin4 和 unix 脚本都运行 osm2pgsql。两者都可以使用来自 docker inspect 的 IP 或服务名称(在本例中为“db”)进行连接。
虽然我承认我对 docker 和 postgis 都比较缺乏经验,但通常一些谷歌搜索可以帮助我找到问题,但这次没有 - 请帮忙!
【问题讨论】:
-
尝试使用
localhost而不是 inspect 给出的 IP。 -
嗨@HansKilian,感谢您的快速回复。不幸的是,这给了我一个不同的错误 - '致命:角色“postgres”不存在'
-
它让你更近了一步,因为现在你可以连接了。我不知道你现在得到的错误的解决方案。也许其他人可以提供帮助?
-
这似乎将我连接到另一个本地 postgres 数据库。我可以使用 psql 连接到它,但是 \dt 和 \du 没有列出我的 docker 托管数据库中存在的任何表或用户。但是,当我进入 docker 容器并使用 psql 时,我可以看到正确的表。
标签: postgresql docker docker-compose postgis openstreetmap