postgresql - docker-compose up 与 docker-compose run,为什么后者似乎没有启动服务?

标签 postgresql docker docker-compose

这是我的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 服务 没有启动。 为什么

什么

    --entrypoint CMD      Override the entrypoint of the image.

docker-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.

如果您查看 hostnameifconfig 的输出,您会看到 exec 将您连接到现有的 dbrun 会让你进入一个新的状态。

响应 OP 的链接 this article ,我之前应该强调的是,虽然在 Docker 下运行 PostgreSQL 没有错,但是运行数据库与无状态的一般容器精神背道而驰。在像数据库这样的有状态和持久性容器的上下文中,docker-compose run 命令似乎毫无意义。

关于postgresql - docker-compose up 与 docker-compose run,为什么后者似乎没有启动服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62657762/

相关文章:

node.js - Azure Linux Web 服务器没有响应我的 Docker 容器

docker - 为什么 httpd 容器在 Docker 中立即退出而没有任何错误

mysql - docker-compose volume question and error --initialize specified 但数据目录中有文件。中止

docker - 如何在 Dockerfile 中为 VOLUME 指定源和目标?

android - Sqitch 使用 sqitch 抛出 fe_sendauth(无密码)错误

spring - 无法在事务中间更改事务只读属性

java - 未使用迁移查询的默认值创建 JPA 实体

sql - Postgresql 选择计数查询需要很长时间

php - 为什么我的 Docker Symfony 项目消耗这么多内存?

docker - 了解多阶段 DockerFile 构建