【问题标题】:docker-compose up versus docker-compose run, why the latter seems not to start the services?docker-compose up 与 docker-compose run,为什么后者似乎没有启动服务?
【发布时间】:2020-06-30 12:45:16
【问题描述】:

这是我的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.

in docker-compose run --help 真的是什么意思?如果有一些东西要被覆盖而不是意味着应该执行入口点,不应该吗?

更新 我检查了https://docs.docker.com/compose/reference/run/,考虑了--service-ports 是否会提供任何帮助,但它没有(并不惊讶,正如我上面强调的,postgres 服务没有启动,所以我不明白它是怎么回事一个端口问题),甚至找到了一个例子:

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

但是,唉!这正是我试图做的无济于事!

【问题讨论】:

标签: postgresql docker docker-compose


【解决方案1】:

请看这个答案: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 将您连接到现有的db,而run 将您连接到一个新的run

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

【讨论】:

  • 确实,只有当我指定了命令起作用的 db_host 时:docker-compose run db psql -d test_db -U tester -h host.docker.internal 并且 docker 必须启动。
  • 然而,当我只想测试数据库时,我需要启动所有服务仍然令人沮丧。坦率地说,与docker-compose exec 相比,docker-compose run 毫无意义。
  • 现在我了解了docker-compose rundocker-compose exec 之间的区别,请参阅here
【解决方案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 ...。您可以使用docker-compose run 而不是psql 来测试每个普通命令(如ls, pwd, ...)是否运行良好。

如果您不运行 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 确实有效。
【解决方案3】:

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

入口点是每次运行容器时都会运行的命令或脚本,并且不能被覆盖。 CMD 可以用 docker-compose 中的参数代替,ENTRYPOINT 不行。

【讨论】:

  • 请将所有信息添加到您的答案中,而不是链接到外部资源 - 这如何回答关于为什么第二个命令无法按预期工作的主要问题?
猜你喜欢
  • 2020-06-30
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 2022-01-23
  • 2018-12-18
  • 1970-01-01
相关资源
最近更新 更多