我在尝试使用docker-compose脚本启动mysql数据库和Django项目时遇到了问题,但是要让Django项目等待mysql数据库准备就绪。
我有两个文件,一个是Dockerfile,一个是docker-compose.yml,下面是它们的内容。
当我运行docker-compose.yml,并检查Web容器的日志时,它会说无法连接到数据库mydb。 但是第二次运行它(不清除容器和镜像),它可以正确连接并且Django应用程序正常工作。
我花了一整天尝试各种方法,如脚本,健康检查等,但是我无法使其正常工作。
Dockerfile
FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY ./ /code/
RUN pip install -r requirements.txt
RUN python manage.py collectstatic --noinput
docker-compose.yml
version: '3'
services:
mydb:
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_USER=django
- MYSQL_PASSWORD=secret
- MYSQL_DATABASE=dbMarksWebsite
image: mysql:5.7
ports:
# Map default mysql port 3306 to 3308 on outside so that I can connect
# to mysql using workbench localhost with port 3308
- "3308:3306"
web:
environment:
- DJANGO_DEBUG=1
- DOCKER_PASSWORD=secret
- DOCKER_USER=django
- DOCKER_DB=dbMarksWebsite
- DOCKER_HOST=mydb
- DOCKER_PORT=3306
build: .
command: >
sh -c "sleep 10 &&
python manage.py migrate &&
python manage.py loaddata myprojects_testdata.json &&
python manage.py runserver 0.0.0.0:8080"
ports:
- "8080:8080"
depends_on:
- mydb
第一次运行(没有现有映像或容器):
...
File "/usr/local/lib/python3.6/site-packages/MySQLdb/__init__.py", line 84, in Connect
return Connection(*args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/MySQLdb/connections.py", line 179, in __init__
super(Connection, self).__init__(*args, **kwargs2)
django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'mydb' (115)")
第二次运行:
System check identified no issues (0 silenced).
March 27, 2020 - 16:44:57
Django version 2.2.11, using settings 'ebdjango.settings'
Starting development server at http://0.0.0.0:8080/
Quit the server with CONTROL-C.
depends_on
等待mydb
服务启动后再启动web
服务,但此时mydb
服务可能还没有准备好。您需要在Web应用程序中处理这种情况。在生产环境中,数据库可能会在某些时候不可用,应用程序应该能够从这种情况中_恢复_。 - Stefan Golubović