postgresql - docker-compose up 与 docker-compose run,为什么后者似乎没有启动服务?
问题描述
这是我的docker-compose.yml
:
version: '3.8'
services:
db:
image: postgres:12-alpine
environment:
- POSTGRES_USER=tester
- POSTGRES_PASSWORD=atest
- POSTGRES_DB=test_db
ports:
- 5432:5432
expose:
- 5432
正在做:
> docker-compose up -d
...
> psql test_db -U tester -h localhost
Password for user tester:
psql (12.3)
Type "help" for help.
test_db=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+--------+----------+------------+------------+-------------------
postgres | tester | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | tester | UTF8 | en_US.utf8 | en_US.utf8 | =c/tester +
| | | | | tester=CTc/tester
template1 | tester | UTF8 | en_US.utf8 | en_US.utf8 | =c/tester +
| | | | | tester=CTc/tester
test_db | tester | UTF8 | en_US.utf8 | en_US.utf8 |
(4 rows)
\q
> docker-compose exec db ps awx
PID USER TIME COMMAND
1 postgres 0:00 postgres
46 postgres 0:00 postgres: checkpointer
47 postgres 0:00 postgres: background writer
48 postgres 0:00 postgres: walwriter
49 postgres 0:00 postgres: autovacuum launcher
50 postgres 0:00 postgres: stats collector
51 postgres 0:00 postgres: logical replication launcher
52 root 0:00 ps awx
工作正常。如果这样做也一样:
docker-compose exec db psql test_db -U tester
这也很好。
但是,请执行以下操作:
> docker-compose down
> docker-compose run db psql test_db -U tester
psql: error: could not connect to server: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
failed to resize tty, using default size
> docker-compose run db /bin/sh
/ # ps awx
PID USER TIME COMMAND
1 root 0:00 /bin/sh
7 root 0:00 ps awx
docker-compose run db
所以我可以看到postgres service
没有开始使用。为什么?
什么
--entrypoint CMD Override the entrypoint of the image.
indocker-compose run --help
真的是什么意思?如果有一些东西要被覆盖而不是意味着应该执行入口点,不应该吗?
更新
我检查了https://docs.docker.com/compose/reference/run/,考虑是否--service-ports
会做任何帮助,但它没有(并不惊讶,正如我上面强调的,postgres
服务没有启动,所以我看不出它怎么可能是端口问题),甚至找到了一个例子:
docker-compose run db psql -h db -U docker
可惜!这正是我试图做的无济于事!
解决方案
请看这个答案: Mysql client called with `docker-compose run` vs. `docker-compose exec`
当你这样做时,它会创建一个与你的配置分开docker-compose run
的新实例。db
docker-compose.yml
查看正在发生的事情的最好方法是运行docker-compose up
,然后从另一个 shell 运行docker-compose exec db bash
,然后从另一个 shell 运行docker-compose run db bash
。
如果您查看 and 的输出hostname
,ifconfig
您会看到exec
它将您连接到现有的db
,而run
将您带入一个新的。
为了回应 OP 对本文的链接,我之前应该强调,虽然在 Docker 下运行 PostgreSQL 并没有什么问题,但运行数据库与一般容器的无状态精神背道而驰。在像数据库这样的有状态和持久性容器的上下文中,该docker-compose run
命令似乎没有意义。
推荐阅读
- wordpress - 创建项目切换轮播
- html - 图像不会出现在 css 中,适用于 position:relative
- postgresql - 带有 TimescaleDB 扩展的 Debezium 连接器
- android - 如何在改造中发送数组
- python - 无法使用 Selenium 成功进行 Google 搜索
- azure-functions - 一个功能应用程序中的多个持久功能
- c# - 将接口映射到具体类时如何规定 Autofixture 的顺序?
- r - 如何使用 grepl 从字符串中过滤掉匹配项?
- javascript - 如何使用 analytics.js 将公共数据(地区、货币、语言)传递给 segment.io
- c - typedef 用于在 C 中注册构造函数