标题:
docker-compose 关键字:depends_on
不检查ready装填,未按启动顺序执行的问题
示例代码:
version: '3'
networks:
web_network:
driver: bridge
nginx_network:
driver: bridge
services:
web:
build: .
image: web
container_name: web
networks:
- web_network
restart: "no"
command: sh -c "python /www/MoviesTicketSystem/manage.py makemigrations &&
python /www/MoviesTicketSystem/manage.py migrate &&
python /www/MoviesTicketSystem/manage.py init_admin &&
python /www/MoviesTicketSystem/manage.py collectstatic --noinput &&
uwsgi --ini /www/MoviesTicketSystem/uwsgi.ini"
expose:
- "8888"
depends_on:
- mysql
volumes:
- ./collect_static:/www/MoviesTicketSystem/collect_static
- ./media:/www/MoviesTicketSystem/media
nginx:
build: ./build/nginx/
ports:
- "80:80"
container_name: nginx
networks:
- nginx_network
- web_network
restart: "no"
depends_on:
- web
volumes:
- ./collect_static:/www/collect_static
- ./media:/www/media
mysql:
image: mysql:latest
container_name: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: ******
MYSQL_DATABASE: ******
MYSQL_USER: ******
MYSQL_PASSWORD: ******
restart: "no"
networks:
- web_network
-
实际问题:
在实际启动中,启动顺序确实按照了
mysql > web > nginx
的顺序启动,但depends_on
关键字不会检查mysql
的ready
状态,且官方也表示了这个问题。 -
如何解决:
-
解决方案一:
在web部分修改restart参数的值为
on-failure
或者always
,意思就是当web启动后,但是mysql未初始化完毕,导致web退出后进行重启,重新初始化。优点:简单高效,缺点:不准确- on-failure 若容器的退出状态非0,则docker自动重启容器,还可以指定重启次数,若超过指定次数未能启动容器则放弃 - no 默认值,表示容器退出时,docker不自动重启容器 - always 容器退出时总是重启 - unless-stopped 容器退出时总是重启,但不考虑Docker守护进程启动时就已经停止的容器 如果容器启动时没有设置–restart参数,则通过下面命令进行更新: docker update --restart=always
-
解决方案二:
使用一些脚本对mysql的状态进行检查,如果mysql准备完毕,则进行web的初始化。对应修改:
services: web: build: . image: web container_name: web networks: - web_network restart: "no" command: sh -c "bash /entrypoint.sh mysql:3306 --strict --timeout=0 -- && python /www/MoviesTicketSystem/manage.py makemigrations && python /www/MoviesTicketSystem/manage.py migrate && python /www/MoviesTicketSystem/manage.py init_admin && python /www/MoviesTicketSystem/manage.py collectstatic --noinput && uwsgi --ini /www/MoviesTicketSystem/uwsgi.ini" # entrypoint.sh内容来自:https://github.com/vishnubob/wait-for-it
-