Docker 图像等待 postgres 图像启动 - 没有 Bash

Docker image wait for postgres image to start - without Bash

我有一个标准 Python docker 图像需要在 postgers 以其标准图像正确启动后启动。

我知道我可以在 docker-compose 文件中添加此 Bash 命令:

command: bash -c 'while !</dev/tcp/db/5432; do sleep 1; done; npm start'
depends_on:
  - mypostgres

但我没有在标准 python docker 映像中安装 bash,我正在尝试将安装保持在最低限度。

有没有办法在我的映像中没有安装 bash 的情况下等待 postgres?

I have a standard Python docker image that needs to start after postgres is properly started in its standard image.

您提到了“Python docker 图片”,但您似乎在调用 npm start,这是一个 node.js 应用程序,而不是 Python申请。

标准 Python 图像 do 已安装 bash(官方 Node 图像也是如此):

$ docker run -it --rm python:3.10 bash
root@c9bdac2e23f9:/#

但是,在任何情况下,仅仅检查可用端口可能是不够的,所以您真正想要的是对数据库执行查询,并且只有在查询成功后才继续。

一个常见的解决方案是循环安装 postgres cli 和 运行 psql,如下所示:

until psql -h $HOST -U $USER -d $DB_NAME -c 'select 1' >/dev/null 2>&1; do
  echo 'Waiting for database...'
  sleep 1
done

您可以使用环境变量或 .pgpass 文件来提供适当的密码。

如果您要构建自定义图像,最好将此逻辑放在 ENTRYPOINT 脚本中,而不是将其嵌入 docker-compose.yamlcommand 字段中。

如果您不想 psql,您可以在 Python 或 Node 中使用任何可用的 Postgres 绑定编写相同的逻辑(例如,psycopg2 用于 Python).


更好 的解决方案是让您的应用程序在面对数据库故障时保持健壮,因为这允许您的应用程序在数据库暂时不可用时继续 运行ning重启期间。