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

时间:2017-06-05 21:19:02

标签: postgresql docker exec docker-compose wait

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

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

我知道我也可以运行一个Python脚本,但理想情况下我想使用wait-for-it.sh等待服务器出现而不是只是睡觉。

Dockerfile(用于填充程序):

 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

搬运工-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

2 个答案:

答案 0 :(得分:2)

谢尔盖的评论。我的论点顺序错了。这个问题与docker无关,也与我无法阅读无关。

答案 1 :(得分:0)

我做了一个例子,你可以看到它有效:

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

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