Docker - 如何在postgres容器中运行psql命令?

Dab*_*gab 43 postgresql docker docker-compose

我想在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     
Run Code Online (Sandbox Code Playgroud)

这里的容器:

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
Run Code Online (Sandbox Code Playgroud)

这是我的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
Run Code Online (Sandbox Code Playgroud)

Alk*_*ris 74

docker exec -it yiialkalmi_postgres_1 psql -U project -W project project
Run Code Online (Sandbox Code Playgroud)

一些解释

  • 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 密码
  • project 要连接的数据库.

这些是你在这里指定的

environment:
    POSTGRES_DB: project
    POSTGRES_USER: project
    POSTGRES_PASSWORD: project
Run Code Online (Sandbox Code Playgroud)

  • 运行上面的命令后,我得到了`psql:警告:额外的命令行参数“项目”被忽略`对我来说这有效,`docker exec -it <container_id> psql -U <username> -W <database_name>` (3认同)
  • 确切地说,您必须在您连接到容器的用户处获得 `psql: FATAL: role "root" does not exit` (`root@<SOMETHING>:/#`) (2认同)
  • 如果你有一个正在运行的容器(`docker-compose up postgres`),`docker-compose exec postgres psql -U project -W project` 也可以工作。 (2认同)

小智 28

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

docker exec -it <containerID>(postgres container name / ID) bash
Run Code Online (Sandbox Code Playgroud)

切换到Postgres用户:

su - postgres
Run Code Online (Sandbox Code Playgroud)

然后运行:

psql
Run Code Online (Sandbox Code Playgroud)

它将打开 Postgres 的终端访问。


小智 9

您可以使用 docker-compose 通过键入以下内容进入 postgres 容器内部

docker-compose exec postgres bash
Run Code Online (Sandbox Code Playgroud)

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

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

docker-compose -f < specific docker-compose.yml> exec postgres bash
Run Code Online (Sandbox Code Playgroud)

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

docker-compose -f local.yml exec postgres bash
Run Code Online (Sandbox Code Playgroud)

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

psql -U <database username you want to connect with> -d <database name>
Run Code Online (Sandbox Code Playgroud)

巴姆!!!!!你在。


Alf*_*bel 8

这对我有用:

转到 bash :

docker exec -it <container-name> bash
Run Code Online (Sandbox Code Playgroud)

来自 bash :

psql -U <dataBaseUserName> <dataBaseName>
Run Code Online (Sandbox Code Playgroud)

或者只是这个单线:

docker exec -it  <container-name> psql -U <dataBaseUserName> <dataBaseName>
Run Code Online (Sandbox Code Playgroud)

有帮助吗?


jos*_*elo 7

如果要在容器中还原数据库,可以执行此操作

docker exec -i app_db_1 psql -U postgres < app_development.back
Run Code Online (Sandbox Code Playgroud)

别忘了添加-i

:)


Voj*_*tek 5

如果您正在运行“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"
Run Code Online (Sandbox Code Playgroud)