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

4
我有一个 Python Docker 容器,需要等到另一个容器(Postgres 服务器)完成设置。我尝试了标准的 wait-for-it.sh,但其中几个命令未被包含。我尝试了基本的 sleep(同样在 sh 文件中),但现在当尝试最终执行我正在等待的命令时,它报告“exec: 300: not found”。
如何解决这个问题(最好不要更改镜像,也不需要扩展镜像)?
我知道我也可以运行一个 Python 脚本,但理想情况下,我想使用 wait-for-it.sh 等待服务器启动,而不仅仅是睡眠。
Dockerfile(用于 stuffer):
 FROM python:2.7.13

 ADD ./stuff/bin /usr/local/bin/
 ADD ./stuff /usr/local/stuff
 WORKDIR /usr/local/bin

 COPY requirements.txt /opt/updater/requirements.txt
 COPY internal_requirements.txt /opt/stuff/internal_requirements.txt

 RUN pip install -r /opt/stuff/requirements.txt
 RUN pip install -r /opt/stuff/other_requirements.txt

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):

 #!/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

请问您能给我展示一下 Dockerfile 和 entrypoint 吗? - Bukharov Sergey
什么是安装bash命令的最佳方法?我知道理论上可以在Python镜像中安装Postgres以获得psql,但exec不是我应该安装的东西。 - north.mister
2
尝试更改以下代码行:command: ["./wait-for-postgres.sh", "-t", "300", "localhost:5432", "--", "python", "./stuffing.py", "--file", "./afile"]command: ["./wait-for-postgres.sh", "localhost:5432", "-t", "300", "--", "python", "./stuffing.py", "--file", "./afile"] wait for it期望第一个参数为主机名:端口。 - Bukharov Sergey
我想我找到了问题所在。就像你所说的那样,“300”不是exec的命令。只是看着它,我以为那是某个地方的行号。对于这个愚蠢的问题,我道歉。 - north.mister
2个回答

4

Sergey的评论。我使用了错误的参数顺序。这个问题与docker无关,而是与我阅读能力有关。


0

我制作了一个示例,这样你就可以看到它的工作原理:

https://github.com/nitzap/wait-for-postgres

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


你能再详细解释一下吗?我的目标是将postgres容器绑定到主机上的localhost,然后第二个容器连接到它。(这些容器的目的是拥有一个标准的本地开发数据库设置)。 - north.mister
如果您可以看到该项目,则应用程序容器期望postgres容器已准备就绪。现在,如果您想单独使用基础部分,则端口也会被发布,就像它是本地的一样。 - German

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