主要遇到的问题是 docker-compost depends_on 依赖某个容器构建时 如果该容器只是run运行状态没有完全构建完成ready状态时 出现的问题 比如我们的app项目脚本里面是
python3 manage.py makemigrations && python3 manage.py migrate &&
同步数据库时 mysql还没有完全构建成功后 会报错 没有找到数据表
所以这里使用到了wait-for-it.sh 这个文件可以帮我们通过端口监听连接的状态来判断该容器服务是否已启动ready
app:
restart: always
# image: my_python
build: .
# command: bash -c "python3 manage.py collectstatic --no-input && python3 manage.py makemigrations && python3 manage.py migrate && python3 manage.py runserver 0.0.0.0:9000"
# command: bash start.sh
# command: uwsgi --ini uwsgi.ini
volumes:
- .:/usr/src/app
- static-volume:/usr/src/app/static
- media-volume:/usr/src/app/media
- ./config/supervisor:/var/supervisor/conf.d
command: bash wait-for-it.sh db:3306 -- bash start.sh
ports:
- "8000:8000"
depends_on:
- redis
- db
这里是用 wait-for-it.sh 通过访问3306 查看mysql状态ready后 再去执行我们的脚本
具体内容wait-for-it.sh 可以自己去看 https://docs.docker.com/compose/startup-order/
github地址是: https://github.com/eficode/wait-for/blob/master/wait-for
有个地方需要注意 command命令的话不要使用['. wait-for-it.sh, 'db:3306', '--', 'start.sh'] 这种方式去运行脚本 使用
command: bash . wait-for-it.sh db:3306 -- bash start.sh
这样去执行
其实后面觉得每次这样等待mysql启动再去执行 migrate 也没有必要 就还是放弃使用了 毕竟这样的话 docker-compose up 启动项目的时间会久一点 不如构建项目成功后自己 进入 exec -it 进入容器去运行命令