什么是同步docker数据库容器的Python脚本的最佳方式?
我正在尝试使用docker-compose
在一个容器中运行一个python脚本,该容器在单独的容器中填充数据库。 我的问题是脚本在数据库准备好接受连接之前启动。 有没有办法避免这种情况,仍然使用docker-compose
?
我的另一种select是创build一个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
在启动脚本之前,您可以让etlt容器进入睡眠状态
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脚本之前会hibernate10秒钟。
固定sleep 10
是一种select。
另一种方法是让etl代码重试连接几次,每次尝试(〜1s)之间的睡眠时间较短。 当连接成功时你知道容器已经准备就绪,所以脚本可以继续。
通过连续多次尝试连接,睡眠时间更短,平均等待时间更短。