簡體   English   中英

如何在docker容器啟動時通過psql(-h localhost -p 5432)連接到postgres

[英]How to connect to postgres by psql (-h localhost -p 5432) when docker container starts

我有一些 docker-compose.yml 文件。 在這個文件中定義了數據庫服務(postgres:9.6):

db:
image: postgres:9.6
volumes:
  - ./test/data/postgresql/:/var/lib/postgresql/data:delegated
  - ./test/bootstrap/postgres:/docker-entrypoint-initdb.d:delegated
ports:
  - 15432:5432
environment:
  - POSTGRES_DB=test
  - POSTGRES_USER=test
  - PGDATA=/var/lib/postgresql/data/testdata

還有一些 sh ​​腳本位於./test/bootstrap/postgres 在這個腳本中,我嘗試通過 psql 連接到 postgres: psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -h localhost -p 5432(我知道-h localhost -p 5432不是必需的,但我需要它)。
當我的容器啟動時發生錯誤:

psql: could not connect to server: Connection refused 
   Is the server running on host "localhost" (127.0.0.1) and accepting 
   TCP/IP connections on port 5432? 

但是在此之后我重新啟動(在第一次啟動此腳本后未執行)我的數據庫容器然后在容器中手動運行 sh 腳本並成功執行。 即使是第一次啟動,它也可以連接到本地主機和端口 5432。

如果我像 psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" 這樣的腳本連接,則沒有連接錯誤。

有人可以向我解釋這種奇怪的行為嗎? 為什么我在容器啟動時無法連接到 localhost:5432 但如果從容器手動連接它連接成功?

謝謝!

我的理解是,在容器初始化期間,服務器正在偵聽 Unix 域套接字。

LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"

docker-entrypoint-init.d目錄中的腳本在服務器以這種模式運行時執行。 您正在嘗試通過指定-h localhost通過 TCP/IP 進行連接。 嘗試刪除該參數以使用 Unix 套接字連接到服務器。

嘗試在您的腳本中添加一個 sleep 命令,以便為您的數據庫提供足夠的時間以正確啟動。

根據 hub.docker.com/_/postgres 上的文檔,要添加自定義腳本以在容器啟動時運行,請創建如下所示的 shell 腳本並創建一個自定義 Dockerfile,您將在其中將 shell 腳本復制到 /docker -入口點-initdb.d/

假設您將以下腳本作為 initdatabase.sh 保存在與下面示例中定義的自定義 Dockerfile 相同的文件夾中,當您構建映像時,您將創建運行以下定義的以下 sql 語句的自定義映像。

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE USER user;
    CREATE DATABASE customdatabase;
    GRANT ALL PRIVILEGES ON DATABASE bloodapp TO user;
    // add other sql statements here
EOSQL
FROM mdillon/postgis:9.6-alpine

COPY initdatabase.sh /docker-entrypoint-initdb.d/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM