构建 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

CLLocationmanager 在约 30 秒后抛出

画布在 LoadFromJson 后抛出污染错误

React 组件刷新后抛出 const undefined 错误

用户单击信息图标后抛出免责声明文本的最简单方法?