You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:25:16