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

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

我试图通过运行通过main以及postgresdb服务来访问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作为数据库configuration文件中的主机例如:

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

你正试图连接Postgresdb容器,但容器并不知道你在main容器中设置的别名postgresdb

考虑下面的例子:

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

现在你看到Postgresdb不知道如何parsingpostgresdb 。 但postgresdb应该可以从main解决。

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

  1. 尝试显式设置Postgresdb的主机名(在你docker-compose.yml );
  2. 以这种方式从main容器访问Postgresdb: $ docker exec -it main_container_full_name psql -h postgresdb -U docker mydatabase

自从这个问题最初被问到以后,事情已经有所改变了。

以下是如何使用docker-compose访问PostgreSQL的shell(psql):

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

泊坞窗,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命令中查找容器标识(或容器名称)
  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/