Docker部署MySQL+Django后端遇1045权限错误求助
问题
首次使用Docker编写docker-compose.yml部署MySQL与Django后端,执行docker-compose up时报错:
django.db.utils.OperationalError: (1045, "Access denied for user 'intranet'@'172.19.0.3' (using password: NO)")
已在本地MySQL Workbench创建127.0.0.1:3306的intranet数据库并完成用户授权,但问题仍存在。
相关配置文件
docker-compose.yml(原配置)
version: "3" services: mysql: image: mysql container_name: my-mysql restart: on-failure ports: - 3306:3306 volumes: - ./mysql_data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: "" MYSQL_USER: intranet MYSQL_PASSWORD: "" MYSQL_DATABASE: intranet MYSQL_ALLOW_EMPTY_PASSWORD: yes healthcheck: test: [ "CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pmy-root-password", ] interval: 10s timeout: 5s retries: 5 backend: build: context: . dockerfile: Dockerfile container_name: my-backend restart: on-failure volumes: - .:/app environment: DATABASE_URL: mysql2://intranet@mysql:3306/intranet SECRET_KEY: x ports: - 8000:8000 depends_on: - mysql command: ["./etc/entry", "web-prod"]
本地执行的MySQL语句
CREATE USER 'intranet'@'localhost'; CREATE DATABASE intranet; GRANT ALL PRIVILEGES ON intranet.* TO 'intranet'@'localhost'; FLUSH PRIVILEGES;
Dockerfile
FROM python:3.7 RUN wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O /usr/local/bin/cloud_sql_proxy \ && chmod +x /usr/local/bin/cloud_sql_proxy RUN pip3 install poetry ENV LC_ALL C.UTF-8 ENV LANG C.UTF-8 # -- Install Application into container: WORKDIR /app COPY pyproject.toml pyproject.toml COPY poetry.lock poetry.lock RUN poetry config virtualenvs.create false && poetry install COPY . /app ARG GIT_VERSION ENV GIT_VERSION $GIT_VERSION ENTRYPOINT ["/app/etc/entry"] CMD ["web-prod"]
分步解决方法
1. 核心问题定位
你操作的是宿主机本地的MySQL实例,但Docker Compose启动的是独立的容器化MySQL实例,两者数据完全隔离,所以本地创建的用户和数据库对容器内的MySQL无效。此外,原docker-compose.yml存在配置错误:
- MySQL健康检查的root密码与实际配置不符
intranet用户未允许Docker网络主机访问- Django未等待MySQL完全就绪就启动
2. 修正MySQL服务配置
更新docker-compose.yml中mysql服务的配置,匹配项目要求的MySQL 5.7版本,修复密码和健康检查:
mysql: image: mysql:5.7 # 对齐README要求的mysql@5.7版本 container_name: my-mysql restart: on-failure ports: - 3306:3306 volumes: - ./mysql_data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: "root_pass" # 设置有效root密码,禁用空密码 MYSQL_USER: intranet MYSQL_PASSWORD: "intranet_pass" # 给intranet用户设置密码 MYSQL_DATABASE: intranet MYSQL_ALLOW_EMPTY_PASSWORD: no healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot_pass"] # 匹配root密码 interval: 10s timeout: 5s retries: 5
3. 调整Django后端配置
修改backend服务的数据库连接URL(加入密码),并设置依赖条件确保MySQL就绪后再启动:
backend: build: context: . dockerfile: Dockerfile container_name: my-backend restart: on-failure volumes: - .:/app environment: DATABASE_URL: mysql2://intranet:intranet_pass@mysql:3306/intranet # 补充用户密码 SECRET_KEY: x ports: - 8000:8000 depends_on: mysql: condition: service_healthy # 等待MySQL健康检查通过 command: ["./etc/entry", "web-prod"]
4. 清理旧数据卷
之前启动的MySQL容器已生成旧数据,需彻底清理避免干扰:
# 停止并删除所有容器及数据卷 docker-compose down -v # 删除本地mysql_data目录(确认无重要数据后执行) rm -rf ./mysql_data
5. 重新启动服务
# 构建并启动所有服务 docker-compose up --build
6. 验证用户权限(可选)
进入MySQL容器确认用户配置:
docker exec -it my-mysql mysql -u root -proot_pass # 查看intranet用户的允许访问主机 SELECT user, host FROM mysql.user WHERE user = 'intranet'; # 预期结果:host为'%',表示允许所有主机连接 # 查看用户权限 SHOW GRANTS FOR 'intranet'@'%';
内容的提问来源于stack exchange,提问作者Mikssx
相关产品推荐
相关产品推荐

