python 2002,“无法通过套接字'/run/mysqld/mysqld.sock'(2)连接到本地MySQL服务器”

falq053o  于 2022-12-25  发布在  Python
关注(0)|答案(2)|浏览(158)

我正在尝试通过docker-compose up启动服务器
我得到一个错误:

  • 2002,“无法通过套接字'/run/mysqld/mysqld.sock'连接到本地MySQL服务器(2)"*
    停靠-编写.yml
version: '3'

services:
  db:
    image: mysql:5.7
    environment:
       MYSQL_DATABASE: 'slack_bot1'
       MYSQL_USER: 'root'
       MYSQL_PASSWORD: ''
       MYSQL_ROOT_PASSWORD: '****'
    volumes:
      - /opt/slack_bot/mysql_data:/var/lib/mysql
  redis:
    image: "redis:alpine"
    volumes:
      - /opt/slack_bot/redis_data:/var/lib/redis
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8001
    ports:
      - "8001:8001"
    depends_on:
      - db

停靠文件

FROM python:3.7-alpine
ENV PYTHONUNBUFFERED 1
WORKDIR /home/slack_bot
ADD requirements.txt /home/slack_bot/
RUN set -e; \
        apk add --no-cache --virtual .build-deps \
                gcc \
                libc-dev \
                linux-headers \
                mariadb-dev \
                python3-dev \
        ;
RUN pip install -r requirements.txt
ADD . /home/slack_bot/
EXPOSE 8001
CMD ["python", "manage.py",  "runserver", "0.0.0.0:8001"]

** Docker ps**日志

CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS                          PORTS                                                                                                                                         NAMES
68b61ca0ce74        slack_bot_web                          "python manage.py ru…"   8 minutes ago       Up 32 seconds                   0.0.0.0:8001->8001/tcp                                                                                                                        slack_bot_web_1
c5f254a527b0        mysql:5.7                              "docker-entrypoint.s…"   8 minutes ago       Up 34 seconds                   3306/tcp, 33060/tcp                                                                                                                           slack_bot_db_1
4cbc1fa3765e        redis:alpine                           "docker-entrypoint.s…"   15 minutes ago      Up 33 seconds                   6379/tcp                                                                                                                                      slack_bot_redis_1

数据库的Django设置

'ENGINE': 'django.db.backends.mysql',
        'NAME': 'slack_bot1',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
ffx8fchx

ffx8fchx1#

在你的django设置中,你把数据库主机设置为EMPTY,那么默认值将是localhost。当使用localhost时,mysql客户端驱动程序将使用unix socket而不是tcp连接mysql服务器。
因此,对于您的情况,您需要将mysql容器中的unix socket导出到卷,然后您的django应用容器利用此卷共享unix socket
接下来是您需要做的事情:
1.手动新建一个文件夹,稍后作为卷来共享您的unix套接字文件
(重要提示:您不能依赖于docker-compose来新建此文件夹,您将遇到权限错误)

mkdir -p /tmp/slack_bot/mysqld && chmod -R 777 /tmp/slack_bot/mysqld

1.在docker-compose.yaml中,向mysql服务再添加一个卷:

db:
    image: mysql:5.7
    environment:
       MYSQL_DATABASE: 'slack_bot1'
       MYSQL_USER: 'root'
       MYSQL_PASSWORD: ''
       MYSQL_ROOT_PASSWORD: '****'
    volumes:
      - /opt/slack_bot/mysql_data:/var/lib/mysql
      - /tmp/slack_bot/mysqld:/var/run/mysqld

1.在docker-compose.yaml中,向web服务再添加一个卷:

web:
    build: .
    command: python manage.py runserver 0.0.0.0:8001
    ports:
      - "8001:8001"
    depends_on:
      - db
    volumes:
      - /tmp/slack_bot/mysqld:/run/mysqld

**注意:**这里您说您得到了错误/run/mysqld/mysqld.sock,我不确定您是否粘贴了所有日志,因为大多数情况下它可能是/var/run/mysqld/mysqld.sock,没有关系,如果错误是/var/run/mysqld/mysqld.sock,则您应该将上面的示例卷修改为- /tmp/slack_bot/mysqld:/var/run/mysqld

2002,“无法通过套接字'/run/mysqld/mysqld.sock'连接到本地MySQL服务器(2)”
有了上面的,现在你的web服务可以共享mysql容器中的unix套接字了。
另外,将HOST配置为db我认为也可以是另一种解决方案,只是unix socket比使用tcp快得多。

7qhs6swi

7qhs6swi2#

我可以通过以下步骤连接django和db docker容器,它们在同一台机器上,但不在同一个docker-compose文件中:

  • 使用host.docker.internal作为www.example.com中的主机settings.py而不是本地主机,如下所示:
DATABASES = {
  'default': {
      'ENGINE': 'django.db.backends.mysql',
      'NAME': 'dbName',
      'USER': 'dbUser',
      'PASSWORD': 'dbUserPassword',
      'HOST': 'host.docker.internal',
      'PORT': '3306'
  }

}

  • 在db合成文件中显示端口
ports:
    - 3306:3306

相关问题