簡體   English   中英

如何從命令行連接到在非默認端口上的 Docker 容器中運行的 Postgres?

[英]How can I connect to Postgres running in a Docker container on a non-default port from the command line?

我是 Docker 的新手,即使在閱讀了有關 Stack Overflow 的幾個類似問題之后,我也並不真正了解通過命令行使用psql連接到 Postgres 需要做什么。 我的 Postgres 容器在端口 6432 上運行,映射到默認端口 5432(我更改了默認端口,因為我還有 Postgres 桌面應用程序在端口 5432 上與其他數據庫一起運行)。

我試過psql -p 6432但我一直收到這個錯誤: psql: error: could not connect to server: No such file or directory 然后我嘗試了psql -h localhost -p 6432 -U root ,並被提示輸入 root 用戶的密碼,即使我輸入了正確的密碼並產生了這個錯誤也失敗了: psql: error: FATAL: database "root" does not exist 我知道我的 Postgres 容器正在運行,因為我可以看到它在 Docker 桌面應用程序中運行。

這是我的docker-compose.yml文件:

version: '3'

networks: 
    my_test_app:

services: 

    # nginx
    nginx-service:
        image: nginx:stable-alpine
        container_name: nginx-container
        ports: 
            - "8080:80"
        volumes: 
            - ./app:/var/www/project
            - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
        depends_on: 
            - php-service
            - postgres-service
        networks: 
            - my_test_app 
  
    # php
    php-service:
        image: php:7.4-fpm-alpine
        container_name: php-container
        ports:
            - "9000:9000"
        working_dir: /var/www/project
        volumes:
            - ./app:/var/www/project
        networks: 
            - my_test_app  

    # postgres
    postgres-service:
        image: postgres:alpine
        container_name: postgres-container
        ports: 
            - "6432:5432"
        volumes: 
            - ./postgres:/var/lib/postgresql/data
        restart: always
        environment: 
            POSTGRES_USER: root
            POSTGRES_PASSWORD: secret
            POSTGRES_DB: db_my_test_app
        networks: 
            - my_test_app

...和我的 nginx 配置文件(我不知道這是否相關):

server {

    listen 80;
    index index.php index.html index.htm;
    server_name localhost;
    root /var/www/project/public;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_pass php-service:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
    }
}

我很感激你能為我提供的任何幫助。 順便說一句,有什么方法可以查看和編輯我使用 Postico 之類的服務在此容器中創建的數據庫(創建/更改表等)?

我認為問題在於您正在嘗試連接到與實際存在的數據庫不同的數據庫。

您在配置中指定一個環境變量:

POSTGRES_DB: db_my_test_app

當這個 postgres 容器啟動並找到一個空的數據目錄時,它會為您創建一個數據庫。 它根據一些檢查確定新數據庫的名稱。 為了:

  1. $POSTGRES_DB的值是多少(如果已設置)
  2. `$POSTGRES_USER 的值是多少,如果設置了
  3. 如果沒有別的,稱之為'postgres'

psql連接到 postgres 時,它必須連接到數據庫。 除非指定了不同的,否則它會嘗試連接到與正在連接的用戶同名的數據庫。

給定您的命令: psql -h localhost -p 6432 -U root ,psql 將嘗試連接到名為root的數據庫。 當它發現這個數據庫不存在時,它會打印以下內容:

❯ psql -h localhost -p 6432 -U root
Password for user root:
psql: error: FATAL:  database "root" does not exist

如果我們指定一個數據庫名稱來匹配在 docker-compose 配置中配置的名稱,我們會得到以下信息:

✖2 ❯ psql -h localhost -p 6432 -U root -d db_my_test_app
Password for user root:
psql (13.2)
Type "help" for help.

db_my_test_app=#

您的快速解決方法是在嘗試連接時指定-d <database_name>

如果您想更改此數據庫的名稱,“postgres 只有在找到空數據目錄時才創建數據庫”這一點變得很重要:因為您指定了 docker 卷./postgres:/var/lib/postgresql/data ,您的數據庫文件將在 docker 撰寫會話之間持久化,您需要刪除主機上的./postgres目錄以將其清除並創建一個新目錄。

順便說一句,由於您最初的問題表明psql無法連接到 postgres,我認為顯示該錯誤消息的樣子也會很有幫助:

❯ psql -h localhost -p 9876
psql: error: could not connect to server: Connection refused
        Is the server running on host "localhost" (::1) and accepting
        TCP/IP connections on port 9876?
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 9876?

暫無
暫無

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

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