【发布时间】:2020-07-08 11:14:46
【问题描述】:
我在尝试获取 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.
【问题讨论】:
-
检查Control startup and shutdown order in Compose。
depends_on等待mydb服务启动,直到启动web服务,但此时mydb服务可能还没有准备好。您需要在 Web 应用程序中处理这种情况。在生产中,DB 可能会在某个时候变得不可用,而应用程序应该能够从这种情况中恢复。 -
嗨,斯特凡,感谢您的回答。因为它是一个 Django 项目,所以我需要在启动服务器之前运行迁移等。不幸的是,我已经尝试过健康检查,但在版本 3 和一些等待脚本中似乎存在问题,但它们似乎并没有等待数据库准备好。我想我可以写一个 python 脚本,看看数据库是否准备好了,但这感觉就像一个可怕的解决方案。
标签: mysql django docker docker-compose