docker-compose:访问postgres的shell(psql)

tkclm6bt  于 2023-08-03  发布在  Docker
关注(0)|答案(5)|浏览(118)

我试图使用docker-compose访问PostgreSQL的shell(psql),但遇到了一些困难...下面是我的docker-compose文件:

main:
  build: .
  volumes:
    - .:/code
  links:
    - postgresdb
  environment:
    - DEBUG=true

postgresdb:
  build: utils/sql/
  ports:
    - "5432"
  environment:
    - DEBUG=true

字符串
我尝试通过mainpostgresdb服务访问psql,方法是运行
docker-compose run postgresdb psql -h postgresdb -U docker mydatabase
但我得到的只有psql: could not translate host name "postgresdb" to address: Name or service not known ...我不明白,因为我在数据库配置文件中使用postgresdb作为主机,例如:

DB_ACCESS = {
    'drivername': 'postgres',
    # Name of docker-compose service
    'host': 'postgresdb',
    'port': '5432',
    'username': 'docker',
    'password': '',
    'database': 'mydatabase'
}

0g0grzrc

0g0grzrc1#

自从最初提出这个问题以来,情况发生了一些变化。
以下是如何使用docker-compose访问PostgreSQL的shell(psql):
1.使用docker-compose.yml版本'2'配置文件
1.使用“depends_on”而不是“links”(版本“2”新增)
1.使用“服务”拆分容器

docker-compoose.yml

version: '2'
services:      
   postgresdb:
     build: utils/sql/
     ports:
       - "5432"
     environment:
       - DEBUG=true
   main:
     build: .
     volumes:
       - .:/code
     depends_on:
       - postgresdb
     environment:
       - DEBUG=true

字符串

在您的Docker引擎 shell 中...

1.从docker ps命令中查找容器ID(或容器名称
1.使用该id打开shell提示符
1.将用户切换到postgres用户帐户
1.运行psql
参见以下示例:

##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.11.2, build HEAD : a6645c3 - Wed Jun  1 22:59:51 UTC 2016
Docker version 1.11.2, build b9f10c9
docker@default:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
b563764171e2        poc_web             "bundle exec rails s "   43 minutes ago      Up 43 minutes       0.0.0.0:3000->3000/tcp   poc_web_1
c6e480b0f26a        postgres            "/docker-entrypoint.s"   49 minutes ago      Up 49 minutes       0.0.0.0:5432->5432/tcp   poc_db_1
docker@default:~$ docker exec -it c6e480b0f26a sh
# su - postgres
No directory, logging in with HOME=/
$ psql
psql (9.5.3)
Type "help" for help.

postgres=#

备注:

  1. docker-compose up将按依赖顺序启动服务
    1.如果你想使用官方镜像创建一个postgres容器,你的docker-compose.yml可能看起来更像下面这样:
version: '2'
services:      
  db:
    image: postgres
    ports:
      - "5432:5432"
. . .

参考文献

https://docs.docker.com/compose/compose-file/

oogrdqng

oogrdqng2#

让我们从一个最小的docker-compose.yml文件开始,以供参考:

version: "3"

services:
  postgres:
    image: postgres:9.5

字符串
您可以使用docker-compose up提供服务。
假设您有一个要连接的数据库,名为test

答案:docker-compose run --rm postgres psql -h YOUR_SERVICE -U YOUR_USER -d YOUR_DATABASE

--rm选项在退出后删除容器,这样就不会创建不必要的重复容器,而只是为了访问数据库。
在我们的示例中,这将是docker-compose run --rm postgres psql -h postgres -U postgres -d test
或者,你可以使用psql的连接字符串:docker compose run --rm postgres psql -d postgres://YOUR_USER@YOUR_SERVICE/YOUR_DATABASE

3phpmpom

3phpmpom3#

您尝试从Postgresdb容器本身连接,但容器不知道您在main容器中设置的别名postgresdb
请考虑以下示例:

$ docker run -it --rm ubuntu hostname --fqdn
817450b29b34

字符串
现在您可以看到Postgresdb不知道如何解析postgresdb。但是postgresdb无论如何都应该可以从main中解析出来。
您有几个机会来解决此问题:
1.尝试显式设置Postgresdb的主机名(在docker-compose.yml中);
1.从main容器访问Postgresdb,方法如下:

$ docker exec -it main_container_full_name psql -h postgresdb -U docker mydatabase

dtcbnfnu

dtcbnfnu4#

以下为我工作:
docker-compose.yaml

services:
  db:
    container_name: db
    image: postgres

字符串
运行docker-compose up
我能跑

sudo docker exec -it -u postgres db psql
postgres=#


去拿贝壳

备注:

1.我使用的是docker-compose版本3
1.我给psql容器起了一个名字(db)。这使我可以避免运行docker ps来获取container_id

  1. -u postgres允许我以 postgres 超级用户的身份访问容器
uubf1zoe

uubf1zoe5#

2023年:

docker-compose up -d <service-name>
docker-compose exec -u postgres <service-name> psql

字符串
瞧!

相关问题