docker-compose 关键字:depends_on 不检查ready装填,未按启动顺序执行的问题

标题:

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关键字不会检查mysqlready状态,且官方也表示了这个问题。

  • 如何解决:

    • 解决方案一:

      在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
      
posted @ 2023-01-13 10:08  lisicn  阅读(371)  评论(0编辑  收藏  举报