docker-compose up和docker-compose run有什么区别?为什么后者似乎无法启动服务?

3
这是我的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中的run指什么?如果有需要覆盖的内容,那么入口点应该被执行,而不是应该被执行吗?

更新: 我查看了https://docs.docker.com/compose/reference/run/,考虑是否--service-ports会有所帮助,但它没有(不出所料,因为如上所述,postgres服务未启动,所以我不认为这可能是端口问题),并找到了一个示例:

docker-compose run db psql -h db -U docker

但唉!这正是我一直在尝试却无济于事的!


这个回答解决了你的问题吗?在使用Docker Compose运行时进行端口发布 - Nico Haase
很遗憾,不行。请看我上面的更新。 - alanwilter
3个回答

5
请参考这个答案:使用 `docker-compose run` 和 `docker-compose exec` 调用 Mysql 客户端
当你使用docker-compose run命令时,它会创建一个与你的docker-compose.yml配置不同的db实例。
最好的方法是运行docker-compose up,然后从另一个shell窗口中运行docker-compose exec db bash,接着从另一个shell窗口中运行docker-compose run db bash
如果你查看hostnameifconfig的输出,你将看到exec命令连接到现有的db,而run则将你放在新的db实例中。
针对OP链接的这篇文章,我应该早些强调一下,尽管在Docker下运行PostgreSQL没有任何问题,但是运行数据库与容器的状态无关。在具有持久性的、有状态的容器(如数据库)背景下,使用docker-compose run命令似乎没有意义。

实际上,只有在我指定了db_host后,该命令才能正常工作: docker-compose run db psql -d test_db -U tester -h host.docker.internal,而且docker必须处于运行状态。 - alanwilter
然而,当我只想测试数据库时,需要启动所有服务仍然让人沮丧。坦白地说,与“docker-compose exec”相比,“docker-compose run”没有任何意义。 - alanwilter
1
现在我明白了docker-compose rundocker-compose exec之间的区别,详情请见这里 - alanwilter

2
我的理解是,docker-compose run 只运行一次命令到你的服务中。它会覆盖之前在你的配置中的命令。在这里,我认为它覆盖了启动容器中 postgres 服务的命令。

(最后一行) https://github.com/docker-library/postgres/blob/1d140375b6830c65cfeaac3642c7fda6d3e1b29a/12/alpine/Dockerfile

在你的情况下,因为你先运行了 docker-compose down,所以当你运行 docker-compose run db psql test_db -U tester 时,你的服务没有运行启动 posgres 的命令,而是运行了你的新命令 psql ...。你可以测试每个普通命令如 ls, pwd, ... 都可以正常运行 docker-compose run 而不是 psql

如果你不运行 docker-compose down,那么使用 docker-compose run db psql test_db -U tester -h db 就可以正常工作。


实际上,使用Docker up和docker-compose run db psql -d test_db -U tester -h host.docker.internal确实可以工作。 - alanwilter

-1

请把所有信息都添加到您的答案中,而不是链接到外部资源——这个答案如何回答“为什么第二条命令不能按预期工作”的主要问题? - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接