Docker部署MySQL与Django遇初始化及未知数据库问题求助
解决Docker+MySQL+Django部署中的几个问题
我来帮你逐个排查并解决遇到的这几个问题:
1. 单独运行MySQL容器的初始化错误
你执行的docker run命令有个小问题:多个环境变量需要分别用-e参数指定,你现在把MYSQL_USER=root和MYSQL_ROOT_PASSWORD=password放在了同一个-e后面,导致MySQL容器无法正确识别密码参数,所以抛出了“database is uninitialized and password option is not specified”的错误。
正确的命令应该是:
docker run --name=mysql -e MYSQL_ROOT_PASSWORD=password -d mysql
另外,MYSQL_USER=root其实是多余的——root是MySQL默认的超级用户,不需要单独指定这个变量来创建它。如果你要创建额外的普通用户,才需要搭配MYSQL_USER和MYSQL_PASSWORD参数使用。
2. docker-compose up时的Unknown database 'bitpal'错误
这个问题的核心是MySQL容器初始化时没有创建bitpal数据库,导致Django连接时报错。原因是你在docker-compose.yml的mysql服务里用错了环境变量名:
- MySQL 5.7镜像用来初始化创建数据库的环境变量是
MYSQL_DATABASE,而你写的是MYSQL_DB,这个变量名是无效的,所以容器启动时并没有自动创建bitpal库。
修改mysql服务的环境变量部分:
mysql: image: mysql:5.7 restart: always hostname: mysql container_name: mysql environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_DATABASE=bitpal # 把原来的MYSQL_DB改成MYSQL_DATABASE ports: - "3306:3306"
修改后重新执行docker-compose up,MySQL容器启动时就会自动创建bitpal数据库,Django就能正常连接了。
3. wait-for-it.sh的放置位置
建议你把wait-for-it.sh放在ROOT/bitpal/bin目录下:
- 你的bitpal、worker、websocket_listener这些服务的
working_dir都是/bitpal,而且启动命令都是调用./bin/下的脚本(比如./bin/start_dev.sh),把wait-for-it.sh放在这里的话,所有需要等待依赖服务(比如MySQL、Redis)启动就绪的服务,都可以在自己的启动脚本里调用它。
比如在start_dev.sh的开头加上:
./bin/wait-for-it.sh mysql:3306 -- ./your-django-start-command
这样能确保Django在MySQL完全启动并就绪后再尝试连接,避免因为启动顺序导致的连接失败(depends_on只保证容器启动顺序,不保证服务内部就绪)。
内容的提问来源于stack exchange,提问作者Norseback
相关产品推荐
相关产品推荐

