16

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

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


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

我试图psql通过运行main以及服务来访问postgresdb

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'
}
4

4 回答 4

16

自从最初提出这个问题以来,情况发生了一些变化。

以下是今天使用 docker-compose 访问 PostgreSQL 的 shell (psql) 的方法:

  1. 使用 docker-compose.yml 版本 '2' 配置文件
  2. 使用“depends_on”而不是“链接”(版本“2”的新功能)
  3. 使用“服务”分解您的容器

码头工人-compose.yml

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

在您的 docker 引擎外壳中...

  1. docker ps从命令中查找容器 id(或容器名称)
  2. 使用该 id 打开 shell 提示符
  3. 将用户切换到 postgres 用户帐户
  4. 运行 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 将按依赖顺序启动服务
  2. 如果你想使用官方镜像建立一个 postgres 容器,你的 docker-compose.yml可能看起来更像下面这样:

    version: '2'
    services:      
      db:
        image: postgres
        ports:
          - "5432:5432"
    . . .
    

参考

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

于 2016-06-11T16:38:35.370 回答
13

让我们从一个最小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

于 2018-01-08T20:37:40.860 回答
5

您正在尝试从自身连接 Postgresdb 容器,但容器不知道postgresdb您在main容器内设置的别名。

考虑以下示例:

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

现在您看到 Postgresdb 不知道如何解决postgresdb. 但无论如何postgresdb应该可以解决。main

你有几个机会来解决这个问题:

  1. 尝试显式设置 Postgresdb 的主机名(在您的docker-compose.yml);
  2. main以这种方式从容器访问 Postgresdb :

    $ docker exec -it main_container_full_name psql -h postgresdb -U docker mydatabase
    
于 2015-04-25T09:55:35.767 回答
1

以下对我有用:

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
  2. 我给 psql 容器起了一个名字(db)。这使我可以避免运行docker ps以获取 container_id
  3. 允许我以postgres超级用户-u postgres身份访问容器
于 2020-01-15T14:56:28.823 回答