构建 Docker mysql 数据库后抛出 OperationalError
Posted
技术标签:
【中文标题】构建 Docker mysql 数据库后抛出 OperationalError【英文标题】:After Build Docker mysql Database throw OperationalError 【发布时间】:2019-11-29 13:56:17 【问题描述】:我正在尝试使用 Docker + nginx + mysql 运行一个 Django 项目,遵循此Link 成功构建后,通过运行
docker-compose up --build
这是我的setting.py数据库连接
DATABASES =
'default':
'ENGINE': 'django.db.backends.mysql',
'NAME': 'smartCut',
'USER': 'antu',
'PASSWORD': 'secure',
'HOST': 'mysql',
'PORT': 3306,
如果我使用 HOST: 'mysql'
(1045, "Access denied for user 'antu'@'172.25.0.3' (using password: YES)")
错误 但是如果我使用 如果我使用 HOST: 'localhost'
(2002, "Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2)")
另外,这个项目在管理面板中找不到静态文件。
我做错了什么?
更新:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
07a5a13e15a1 projectone_web "nginx -g 'daemon of…" 16 seconds ago Up 8 seconds 0.0.0.0:8888->80/tcp web
2431afe3eed2 projectone_python "uwsgi --ini /uwsgi.…" 21 seconds ago Up 17 seconds python
83572753b4ae projectone_mysql "docker-entrypoint.s…" 56 seconds ago Up 52 seconds (healthy) 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
docker-compose.yml
version: "2.4"
services:
web:
container_name: web
build: ./docker/nginx
ports:
- 8888:80
volumes:
- ./app:/var/www/html
working_dir: /etc/nginx
links:
- python
python:
container_name: python
build: ./docker/python
volumes:
- ./app:/var/www/html
working_dir: /var/www/html
depends_on:
mysql:
condition: service_healthy
mysql:
build: docker/mysql
container_name: mysql
ports:
- 3306:3306
volumes:
- data-volume:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=secure
- MYSQL_DATABASE=smartCut
healthcheck:
test: "exit 0"
volumes:
data-volume:
$ docker 日志 83572753b4ae
2019-07-21T10:00:06.327977Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2019-07-21T10:00:06.328151Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.16) starting as process 1
2019-07-21T10:00:06.332333Z 0 [Warning] [MY-013242] [Server] --character-set-server: 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.
2019-07-21T10:00:12.001312Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2019-07-21T10:00:12.150341Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2019-07-21T10:00:12.290955Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.16' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
2019-07-21T10:00:12.817464Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060
【问题讨论】:
这对我有用,我可以用这个 docker compose 连接到 MySQL。您是否更改了此 repo 代码中的任何内容? 我尝试运行两个项目,我在 3306 MySQL 端口中运行一个项目,另一个是 3301 端口,但两者都不起作用 您是否更改了app/config/settings.py
文件和数据库配置?显示此文件。
您需要将您收到的实际错误消息作为文本包含在问题中;不要粘贴浏览器窗口的屏幕截图。显示您告诉应用程序如何连接到数据库的代码或配置也会很有帮助。
USER
在您的数据库设置中应该是 root
。并将mysql
留作主持人。
【参考方案1】:
如前所述,您应该在数据库配置中使用mysql
作为主机,使用root
作为USER
:
DATABASES =
'default':
'ENGINE': 'django.db.backends.mysql',
'NAME': 'smartCut',
'USER': 'root',
'PASSWORD': 'secure',
'HOST': 'mysql',
'PORT': 3306,
mysql
将被解析为 mysql 容器 IP,因为来自 compose 的容器将连接到同一网络。
您还使用环境变量为您的mysql
容器设置了root
密码 - MYSQL_ROOT_PASSWORD=secure
因此必须将root
用作用户。
如果您想创建新用户,您可以使用MYSQL_USER, MYSQL_PASSWORD
环境变量 - 参考可以在mysql docker hub 中找到。相应地修改你的 docker-compose:
version: "2.4"
services:
web:
container_name: web
build: ./docker/nginx
ports:
- 8888:80
volumes:
- ./app:/var/www/html
working_dir: /etc/nginx
links:
- python
python:
container_name: python
build: ./docker/python
volumes:
- ./app:/var/www/html
working_dir: /var/www/html
depends_on:
mysql:
condition: service_healthy
mysql:
build: docker/mysql
container_name: mysql
ports:
- 3306:3306
volumes:
- data-volume:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=secure #root password
- MYSQL_DATABASE=smartCut #this database will be created for MYSQL_USER
- MYSQL_USER=antu
- MYSQL_PASSWORD=secure #your user password
healthcheck:
test: "exit 0"
volumes:
data-volume:
【讨论】:
以上是关于构建 Docker mysql 数据库后抛出 OperationalError的主要内容,如果未能解决你的问题,请参考以下文章
FireBase 在第一轮循环后抛出 WebException 400
Doctrine 2.2 ORM:从数据库进行逆向工程后抛出 MappingException