我正在尝试使用docker-compose
在一个容器中运行python脚本,该容器在单独的容器中填充数据库。我的问题是脚本在数据库准备好接受连接之前启动。有没有办法避免这种情况,仍然使用docker-compose
?
我的另一种选择是创建一个shell脚本,以串行方式触发每个docker容器命令,但如果可能,我宁愿使用docker-compose
。
以下是docker-compose.yml
文件:
etl:
build: ./etl
links:
- mysql
mysql:
image: mariadb
environment:
MYSQL_DATABASE: my_db
MYSQL_ROOT_PASSWORD: a_password
这是我的解决方案shell脚本:
#!/bin/bash
docker run --name mariadb -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb:latest
docker build -t etl ./etl
docker run -it --rm -name my-etl --link mariadb:mysql etl
答案 0 :(得分:0)
您可以在启动脚本之前让etl容器进入休眠状态,即
docker run -it --rm -name my-etl --link mariadb:mysql etl /bin/bash -c "sleep 10 && python your-script"
或在Dockerfile中
CMD ["/bin/bash", "-c", "sleep 10 && python your-script"]
这样,etl容器将在启动python脚本之前休眠10秒。
答案 1 :(得分:0)
固定sleep 10
是一种选择。
另一种方法是让etl代码重试连接几次,每次尝试之间的睡眠时间更短(~1s)。连接成功后,您知道容器已准备就绪,因此脚本可以继续。
通过较短的睡眠时间多次尝试连接,平均等待时间会更短。