docker-compose:访问 postgres 的 shell (psql)
docker-compose: accessing 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
作为主机,例如:
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 不知道如何解析 postgresdb
。但是 postgresdb
应该可以从 main
中解析出来。
您有几次机会解决此问题:
- 尝试为 Postgresdb 显式设置主机名(在您的
docker-compose.yml
中);
以这种方式从 main
容器访问 Postgresdb:
$ docker exec -it main_container_full_name psql -h postgresdb -U docker mydatabase
自最初提出问题以来,情况发生了一些变化。
今天使用 docker-compose 访问 PostgreSQL 的 shell (psql) 的方法如下:
- 使用 docker-compose.yml 版本“2”配置文件
- 使用 'depends_on' 而不是 'links'(版本“2”的新功能)
- 使用 'services'
拆分容器
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 ...
- 从
docker ps
命令 中查找容器 ID(或容器名称)
- 使用该 ID 打开 shell 提示
- 将用户切换到 postgres 用户帐户
- 运行 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=#
备注:
- docker-compose up将按依赖顺序启动服务
如果你想用官方搭建一个postgres容器
图像,你 docker-compose.yml 可能看起来更像下面这样:
version: '2'
services:
db:
image: postgres
ports:
- "5432:5432"
. . .
参考文献
让我们从一个最小的 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
以下对我有用:
在docker-compose.yaml
services:
db:
container_name: db
image: postgres
然后,运行宁docker-compose up
之后
我可以运行
sudo docker exec -it -u postgres db psql
postgres=#
获得shell
备注:
- 我正在使用 docker-compose 版本 3
- 我已经为 psql 容器命名 (db)。这让我避免了 运行ning
docker ps
得到 container_id
-u postgres
允许我作为 postgres 超级用户 访问容器
我正在尝试使用 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
作为主机,例如:
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 不知道如何解析 postgresdb
。但是 postgresdb
应该可以从 main
中解析出来。
您有几次机会解决此问题:
- 尝试为 Postgresdb 显式设置主机名(在您的
docker-compose.yml
中); 以这种方式从
main
容器访问 Postgresdb:$ docker exec -it main_container_full_name psql -h postgresdb -U docker mydatabase
自最初提出问题以来,情况发生了一些变化。
今天使用 docker-compose 访问 PostgreSQL 的 shell (psql) 的方法如下:
- 使用 docker-compose.yml 版本“2”配置文件
- 使用 'depends_on' 而不是 'links'(版本“2”的新功能)
- 使用 'services' 拆分容器
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 ...
- 从
docker ps
命令 中查找容器 ID(或容器名称)
- 使用该 ID 打开 shell 提示
- 将用户切换到 postgres 用户帐户
- 运行 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=#
备注:
- docker-compose up将按依赖顺序启动服务
如果你想用官方搭建一个postgres容器 图像,你 docker-compose.yml 可能看起来更像下面这样:
version: '2' services: db: image: postgres ports: - "5432:5432" . . .
参考文献
让我们从一个最小的 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
以下对我有用:
在docker-compose.yaml
services:
db:
container_name: db
image: postgres
然后,运行宁docker-compose up
我可以运行
sudo docker exec -it -u postgres db psql
postgres=#
获得shell
备注:
- 我正在使用 docker-compose 版本 3
- 我已经为 psql 容器命名 (db)。这让我避免了 运行ning
docker ps
得到 container_id -u postgres
允许我作为 postgres 超级用户 访问容器