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

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

对我来说,如何在容器中运行 postgre sql 查询或命令有点神秘。

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

我使用 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

这是我的码头作品:

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
178738 次浏览
docker exec -it yiialkalmi_postgres_1 psql -U project -W project

一些解释

  • 将命令运行到正在运行的容器的命令。it标志打开一个交互式 tty。基本上它会导致连接到终端。如果希望打开 bash 终端,可以这样做

docker exec -it yiialkalmi_postgres_1 bash

  • 容器名称(您可以使用容器 id,在您的示例中为 40e39bd0329a )

  • 要对运行的容器执行的命令

  • U用户

  • 告诉 psql 需要在连接时提示用户输入密码。如果没有这个参数,就会有额外的连接尝试,通常会发现需要密码,请参阅 PostgreSQL 文档

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

这些都是你在这里指定的

environment:
POSTGRES_DB: project
POSTGRES_USER: project
POSTGRES_PASSWORD: project

如果你有运行的“ 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"

如果需要在容器中还原数据库,可以这样做:

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

别忘了加 -i

:)

RUN /etc/init.d/postgresql start &&\
psql --command "CREATE USER docker WITH SUPERUSER PASSWORD 'docker';" &&\
createdb -O docker docker &&\

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

docker-compose exec postgres bash

知道 Postgres是服务的名称。替换它与名称的 后续服务在您的多克-撰写文件。

如果您有许多 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>

砰! ! ! ! 你进去了。

这对我很有效:

狂欢:

docker exec -it <container-name> bash

来自 bash:

psql -U <dataBaseUserName> <dataBaseName>

或者只是这句俏皮话:

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

有帮助吗?

我们可以通过使用,

Docker run-it < Container id | name > < sh | bash >

如果假设是她,

Psql-U postgres

会成功的

刚做了个局部测试,不确定 -c是不是你想要的。

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".

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

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

切换到 Postgres 用户:

su - postgres

然后跑:

psql

它将为 Postgres 打开终端通道。

在许多常见的设置中,PostgreSQL 端口被发布到主机。

postgres:
ports:
- '12345:5432'

如果是这种情况,则不需要执行任何特定于 Docker 的操作来连接到数据库。您可以在主机系统上直接使用指向第一个 ports:号码的 psql客户机。

psql -h localhost -p 12345 -U project

这种方法只需要在主机上安装 psql或另一个普通 PostgreSQL 客户机,并且数据库容器配置为从 Docker 外部访问 ports:。(ports:对于集装箱之间的通信是不必要的,面向生产的设置可能合理地不需要它们。)这不需要运行 docker命令的能力和随之而来的安全问题,并且它可以避免从 docker exec sh -c '...'序列引用多层附加命令。

在不使用外部终端的情况下,用户可以在容器 CLI 中运行 SQL 命令。

psql -d [database-name] -U [username] -W

* * 不要忘记用你的实际用户名替换[ database-name ]和你的 db-name & [ username ]

旗帜:

-d : Specify the database name you want to connect
-U : Specify the username as whom you want to connect
-W : Prompt for the password