Postgresql 在python Docker容器中执行wait-for-it.sh

Postgresql 在python Docker容器中执行wait-for-it.sh,postgresql,docker,exec,docker-compose,wait,Postgresql,Docker,Exec,Docker Compose,Wait,我有一个Python docker容器,需要等待另一个容器(postgres服务器)完成安装。我尝试了标准的wait-for-it.sh,但没有包括几个命令。我尝试了一次基本睡眠(同样是在一个sh文件中),但现在它在尝试最终执行我等待的命令时报告exec:300:notfound 我如何解决这个问题(最好不改变图像,或者不需要扩展图像。) 我知道我也可以运行Python脚本,但理想情况下,我希望使用wait-for-it.sh来等待服务器出现,而不仅仅是休眠 Dockerfile(用于填充器):

我有一个Python docker容器,需要等待另一个容器(postgres服务器)完成安装。我尝试了标准的wait-for-it.sh,但没有包括几个命令。我尝试了一次基本睡眠(同样是在一个sh文件中),但现在它在尝试最终执行我等待的命令时报告
exec:300:notfound

我如何解决这个问题(最好不改变图像,或者不需要扩展图像。)

我知道我也可以运行Python脚本,但理想情况下,我希望使用wait-for-it.sh来等待服务器出现,而不仅仅是休眠

Dockerfile(用于填充器):

docker-compose.yml:

 version: '3'
 services:
   local_db:
     build: ./local_db
     ports:
     - "localhost:5432:5432"

   stuffer:
     build: ./
     depends_on:
     - local_db
     command: ["./wait-for-postgres.sh", "-t", "300", "localhost:5432", "--", "python", "./stuffing.py", "--file", "./afile"]
我想使用的脚本(但无法使用,因为没有psql或exec):


谢尔盖的评论。我的论点顺序不对。这个问题与docker无关,而与我的阅读能力有关。

我举了一个例子,这样你就可以看到它起作用了:


另一方面,您也可以在脚本执行过程中出错,以验证服务是否正常工作。您不应将其称为localhost。。。。因为这是在容器的上下文中,如果要指向另一个容器,必须通过服务的名称。

请给我看Dockerfile和entrypoint,好吗?根据需要安装bash命令的最佳方式是什么。我知道理论上我可以在python映像中安装postgres以拥有psql,但我不应该安装exec。尝试将行
命令:[“/wait-forpostgres.sh”、“-t”、“300”、“localhost:5432”、“--”、“python”、“/ficking.py”、“--file”、“/afile”]
更改为
命令:[“/wait-forpostgres.sh”、“localhost:5432”、“-t”“,”300“,”--“,”python“,”/pitching.py“,”--file“,“/afile”]
等待它期望第一个参数是主机名:portI认为我看到了问题。就像你说的。“300”不是exec的命令。只是看着它,我以为那是一个行号。为这个愚蠢的问题道歉。你能再解释一下吗?我的目标是将postgres容器绑定到主机上的localhost,然后第二个容器连接到它。(这些容器的目的是有一个标准的本地dev db设置)。如果您可以看到该项目,应用程序容器希望postgres容器准备就绪。现在,如果要单独使用基址,端口也会像本地端口一样发布。
 version: '3'
 services:
   local_db:
     build: ./local_db
     ports:
     - "localhost:5432:5432"

   stuffer:
     build: ./
     depends_on:
     - local_db
     command: ["./wait-for-postgres.sh", "-t", "300", "localhost:5432", "--", "python", "./stuffing.py", "--file", "./afile"]
 #!/bin/bash
 # wait-for-postgres.sh

 set -e

 host="$1"
 shift
 cmd="$@"

 until psql -h "$host" -U "postgres" -c '\l'; do >&2 echo "Postgres is unavailable - sleeping"
   sleep 1
 done

 >&2 echo "Postgres is up - executing command"
 exec $cmd