我试图使用Docker与Django但我得到错误 – db_1 |错误:数据库未初始化且未指定密码选项
db_1 |您需要指定MYSQL_ROOT_PASSWORD,MYSQL_ALLOW_EMPTY_PASSWORD和MYSQL_RANDOM_ROOT_PASSWORD之一
django.db.utils.OperationalError 🙁 2003,“无法连接到’127.0.0.1上的
MySQL服务器'(111)”).当我使用没有Docker的应用程序时,它可以工作.有什么建议?
我的Dockerfile:
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
我的docker-compose.yml:
version: '3'
services:
db:
image: mysql
web:
build: .
command: python3 Project/myVirtual/backend/pri/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
我已将docker-compose.yaml更改为:
version: '3'
services:
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: ""
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
web:
build: .
command: python3 virtualPRI/PRI/backend/pri/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
但此时进程已经阻止了
db_1 | 2017-06-13T05:16:16.457122Z 0 [Note] End of list of non-natively partitioned tables
或者有时我仍然得到web_1 | django.db.utils.OperationalError:(2003,“无法连接到’127.0.0.1上的MySQL服务器'(111)”)
管理:潘岳:
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pri.settings")
try:
from django.core.management import execute_from_command_line
except ImportError:
# The above import may fail for some other reason. Ensure that the
# issue is really that Django is missing to avoid masking other
# exceptions on Python 2.
try:
import django
except ImportError:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
)
raise
execute_from_command_line(sys.argv)
最佳答案 127.0.0.1(111)表示MySQL拒绝您的连接请求.我假设MySQL服务器和Django没有在同一个Docker实例中运行,是吗?
如果MySQL在其他地方运行,你应该确保在Django的配置文件中正确配置了MySQL连接.
解决方案1:您可以通过将MySQL的绑定地址从127.0.0.1更改为0.0.0.0来允许远程访问MySQL(但我不鼓励您这样做).并正确更新MySQL DB连接设置.
在Linux中你可以从/etc/my.cnf注释掉这些行(位置可以不同)
skip-networking
bind-address = 127.0.0.1
有关更详细的说明,另请参见https://dev.mysql.com/doc/refman/5.5/en/can-not-connect-to-server.html
解决方案2 :(受@programerq的评论启发)您可以在主机操作系统或其他Docker实例中运行MySQL.由于MySQL默认绑定到127.0.0.1,因此当您启动Django Docker实例时,可以将MySQLMachine:MySQLPort映射到DjangoDocker:MySQLPort.因此,Django仍然可以连接到127.0.0.1到MySQL而不会注意到MySQL实际上正在其他地方运行.
我之前在Docker集群项目中做了一些端口映射,你可以check the commands I ran,或查看官方的Docker文档.
希望这些想法能够有所帮助,干杯.