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 dbpostgres service没有启动。为什么

什么

--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 客户端使用 'docker-compose run' 与 'docker-compose exec' 调用

当您执行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将您放入新。

作为对OP链接本文的回应,我应该早点强调,虽然在Docker下运行PostgreSQL没有错,但运行数据库与无状态的一般容器精神背道而驰。 在数据库等有状态和持久容器的上下文中,docker-compose run命令似乎毫无意义。

我的理解是,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

这是一篇关于入口点与CMD的非常有用的文章 https://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/

入口点是每次运行容器时运行的命令或脚本,无法覆盖。CMD可以用docker-compose中的参数替换,ENTRYPOINT不能。

最新更新