2002年,docker-compose up中的“无法通过套接字'/run/mysqld/mysqld.sock'连接到本地MySQL服务器(2)”

7 python mysql django docker docker-compose

我正在尝试通过以下方式启动服务器docker-compose up

\n\n

我收到错误:

\n\n

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

\n\n

docker-compose.yml

\n\n
version: \'3\'\n\nservices:\n  db:\n    image: mysql:5.7\n    environment:\n       MYSQL_DATABASE: \'slack_bot1\'\n       MYSQL_USER: \'root\'\n       MYSQL_PASSWORD: \'\'\n       MYSQL_ROOT_PASSWORD: \'****\'\n    volumes:\n      - /opt/slack_bot/mysql_data:/var/lib/mysql\n  redis:\n    image: "redis:alpine"\n    volumes:\n      - /opt/slack_bot/redis_data:/var/lib/redis\n  web:\n    build: .\n    command: python manage.py runserver 0.0.0.0:8001\n    ports:\n      - "8001:8001"\n    depends_on:\n      - db\n
Run Code Online (Sandbox Code Playgroud)\n\n

Dockerfile

\n\n
FROM python:3.7-alpine\nENV PYTHONUNBUFFERED 1\nWORKDIR /home/slack_bot\nADD requirements.txt /home/slack_bot/\nRUN set -e; \\\n        apk add --no-cache --virtual .build-deps \\\n                gcc \\\n                libc-dev \\\n                linux-headers \\\n                mariadb-dev \\\n                python3-dev \\\n        ;\nRUN pip install -r requirements.txt\nADD . /home/slack_bot/\nEXPOSE 8001\nCMD ["python", "manage.py",  "runserver", "0.0.0.0:8001"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

docker ps日志

\n\n
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS                          PORTS                                                                                                                                         NAMES\n68b61ca0ce74        slack_bot_web                          "python manage.py ru\xe2\x80\xa6"   8 minutes ago       Up 32 seconds                   0.0.0.0:8001->8001/tcp                                                                                                                        slack_bot_web_1\nc5f254a527b0        mysql:5.7                              "docker-entrypoint.s\xe2\x80\xa6"   8 minutes ago       Up 34 seconds                   3306/tcp, 33060/tcp                                                                                                                           slack_bot_db_1\n4cbc1fa3765e        redis:alpine                           "docker-entrypoint.s\xe2\x80\xa6"   15 minutes ago      Up 33 seconds                   6379/tcp                                                                                                                                      slack_bot_redis_1\n
Run Code Online (Sandbox Code Playgroud)\n\n

Django数据库设置

\n\n
        \'ENGINE\': \'django.db.backends.mysql\',\n        \'NAME\': \'slack_bot1\',\n        \'USER\': \'root\',\n        \'PASSWORD\': \'\',\n        \'HOST\': \'\',\n        \'PORT\': \'\',\n
Run Code Online (Sandbox Code Playgroud)\n

atl*_*ine 9

在 django 设置中,将数据库主机保留为 EMPTY,则默认值为localhost。使用时localhost,mysql客户端驱动会与unix socketnot连接mysql服务器tcp

因此,对于您的情况,您需要将unix socketmysql 容器导出到卷,然后您的 django 应用程序容器利用该卷来共享unix socket.

接下来是您需要做的:

  1. 手动新建一个文件夹,稍后将其作为卷来共享您的 unix 套接字文件

    (重要提示:您不能依赖 docker-compose 来新建此文件夹,您将遇到权限错误)

    mkdir -p /tmp/slack_bot/mysqld && chmod -R 777 /tmp/slack_bot/mysqld
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在您的 中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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在您的 中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 Code Online (Sandbox Code Playgroud)

    注意:在这里你说你收到了下一个错误/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 套接字了。

另外,我认为配置HOSTdb可能是另一种解决方案,只是unix socket比使用要快得多tcp