【问题标题】:Docker - How can run the psql command in the postgres container?Docker - 如何在 postgres 容器中运行 psql 命令?
【发布时间】:2021-08-28 05:53:31
【问题描述】:

我想在 postgres 映像中使用 psql 以便在数据库上运行一些查询。 但不幸的是,当我附加到 postgres 容器时,我得到了 psql 命令未找到的错误...

对我来说,如何在容器中运行 postgre sql 查询或命令是一个谜。

如何在 postgres 容器中运行 psql 命令? (我是 Docker 世界的新人)

我使用 Ubuntu 作为主机,并且我没有在主机上安装 postgres,而是使用 postgres 容器。

docker-compose ps
        Name                       Command               State               Ports            
---------------------------------------------------------------------------------------------
yiialkalmi_app_1        /bin/bash                        Exit 0                               
yiialkalmi_nginx_1      nginx -g daemon off;             Up       443/tcp, 0.0.0.0:80->80/tcp 
yiialkalmi_php_1        php-fpm                          Up       9000/tcp                    
yiialkalmi_postgres_1   /docker-entrypoint.sh postgres   Up       5432/tcp                    
yiialkalmi_redis_1      docker-entrypoint.sh redis ...   Up       6379/tcp     

这里是容器:

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
315567db2dff        yiialkalmi_nginx    "nginx -g 'daemon off"   18 hours ago        Up 3 hours          0.0.0.0:80->80/tcp, 443/tcp   yiialkalmi_nginx_1
53577722df71        yiialkalmi_php      "php-fpm"                18 hours ago        Up 3 hours          9000/tcp                      yiialkalmi_php_1
40e39bd0329a        postgres:latest     "/docker-entrypoint.s"   18 hours ago        Up 3 hours          5432/tcp                      yiialkalmi_postgres_1
5cc47477b72d        redis:latest        "docker-entrypoint.sh"   19 hours ago        Up 3 hours          6379/tcp                      yiialkalmi_redis_1

这是我的 docker-compose.yml:

app:
image: ubuntu:16.04
volumes:
    - .:/var/www/html

nginx:
    build: ./docker/nginx/
    ports:
        - 80:80
    links:
        - php
    volumes_from:
        - app
    volumes:
        - ./docker/nginx/conf.d:/etc/nginx/conf.d

php:
    build: ./docker/php/
    expose:
        - 9000
    links:
        - postgres
        - redis
    volumes_from:
        - app

postgres:
    image: postgres:latest
    volumes:
        - /var/lib/postgres
    environment:
        POSTGRES_DB: project
        POSTGRES_USER: project
        POSTGRES_PASSWORD: project

redis:
    image: redis:latest
    expose:
        - 6379

【问题讨论】:

    标签: postgresql docker docker-compose


    【解决方案1】:
    docker exec -it yiialkalmi_postgres_1 psql -U project -W project
    

    一些解释

    • docker exec -it 将命令运行到正在运行的容器的命令。 it 标志打开一个交互式 tty。基本上它会导致附加到终端。如果你想打开 bash 终端,你可以这样做

    docker exec -it yiialkalmi_postgres_1 bash

    • yiialkalmi_postgres_1 容器名称(您可以使用容器 ID,在您的情况下为 40e39bd0329a

    • psql -U project -W project 对正在运行的容器执行的命令

    • U用户

    • W 告诉 psql 在连接时需要提示用户输入密码。 此参数是可选的。 如果没有此参数,则会进行额外的连接尝试,通常会发现需要密码,请参阅PostgreSQL docs

    • project 要连接的数据库。当-d参数是第一个非选项参数时,不需要将其标记为dbname,请参阅文档:-d”相当于在命令行中将dbname指定为第一个非选项参数。”

    这些都是你在这里指定的

    environment:
        POSTGRES_DB: project
        POSTGRES_USER: project
        POSTGRES_PASSWORD: project
    

    【讨论】:

    • 非常感谢它有效。我总是这样尝试:docker exect it 40e39bd0329a /bin/bash,然后在容器中运行psql 命令,但它总是给我错误。
    • 无需运行/bin/bash,因为它已经在路径中。如果您运行docker exec -it 40e39bd0329a bash,然后在容器的bash shell 中执行psql -U project -W project project,它应该可以工作。如果你只执行psql,你应该得到一个关于role not found的错误,这是postgres通知你默认用户(在这种情况下我认为它是root)在postgres的指定用户中不存在跨度>
    • 确切地说,您必须将psql: FATAL: role "root" does not exist 作为您连接到容器的用户 (root@<SOMETHING>:/#) 获得
    • 如果您有一个正在运行的容器 (docker-compose up postgres),docker-compose exec postgres psql -U project -W project 也可以工作。
    • 运行上述命令后,我得到了psql: warning: extra command-line argument "project" ignored 对我来说这有效,docker exec -it <container_id> psql -U <username> -W <database_name>
    【解决方案2】:

    如果您需要在容器中恢复数据库,您可以这样做:

    docker exec -i app_db_1 psql -U postgres < app_development.back
    

    别忘了加-i

    :)

    【讨论】:

      【解决方案3】:

      这对我有用:

      转到 bash :

      docker exec -it <container-name> bash
      

      来自 bash :

      psql -U <dataBaseUserName> <dataBaseName>
      

      或仅此一条:

      docker exec -it  <container-name> psql -U <dataBaseUserName> <dataBaseName>
      

      有帮助吗?

      【讨论】:

      • 这行得通!为什么它不需要密码呢? @Alkis Kalogeis 用 -W "your password" 回答会使 postgresql 感到困惑,它认为我输入的密码是数据库
      【解决方案4】:

      您可以使用 docker-compose 进入 postgres 容器,方法是输入以下内容

      docker-compose exec postgres bash
      

      知道 postgres 是服务的名称。将其替换为 docker-compose 文件中的 Postgresql 服务 的名称。

      如果您有许多 docker-compose 文件,则必须添加要执行命令的特定 docker-compose.yml 文件。请改用以下命令。

      docker-compose -f < specific docker-compose.yml> exec postgres bash
      

      例如,如果您想使用名为 local.yml 的 docker-compose 文件运行命令,则此处的命令将是

      docker-compose -f local.yml exec postgres bash
      

      然后,使用 psql 命令并使用 -d 标志指定数据库名称和使用 -U 标志指定用户名

      psql -U <database username you want to connect with> -d <database name>
      

      呸呸呸!!!!!!你在。

      【讨论】:

        【解决方案5】:

        使用 docker 配置 Postgres 容器后,使用以下命令打开 bash 终端:

        docker exec -it <containerID>(postgres container name / ID) bash
        

        切换到 Postgres 用户:

        su - postgres
        

        然后运行:

        psql
        

        它将打开 Postgres 的终端访问。

        【讨论】:

          【解决方案6】:

          如果您正在运行“postgres”容器:

          docker run -it --rm --link postgres:postgres postgres:9.6 sh -c "exec psql -h \$POSTGRES_PORT_5432_TCP_ADDR -p \$POSTGRES_PORT_5432_TCP_PORT -U postgres"
          

          【讨论】:

            【解决方案7】:

            我们可以使用终端sh或者bash进入容器,

            docker run -it

            如果假设是sh,

            psql -U postgres

            会起作用

            【讨论】:

              【解决方案8】:
              RUN /etc/init.d/postgresql start &&\
                  psql --command "CREATE USER docker WITH SUPERUSER PASSWORD 'docker';" &&\
                  createdb -O docker docker &&\
              

              【讨论】:

              • 虽然这段代码 sn-p 可以解决问题,但包含解释确实有助于提高帖子的质量。请花点时间阅读How to Answer。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因
              【解决方案9】:

              刚刚启动了本地测试,不确定 -c 是否是您从 cli 获得的内容。

              docker run -it --rm --name psql-test-connection -e PGPASSWORD=1234 postgres psql -h kubernetes.docker.internal -U awx -c "\conninfo"
              
              You are connected to database "awx" as user "awx" on host "kubernetes.docker.internal" (address "192.168.65.4") at port "5432".
              

              【讨论】:

                猜你喜欢
                • 2020-06-26
                • 1970-01-01
                • 1970-01-01
                • 2022-11-10
                • 1970-01-01
                • 1970-01-01
                • 2021-09-25
                • 2020-05-21
                • 1970-01-01
                相关资源
                最近更新 更多