2002, «Не удается подключиться к локальному серверу MySQL через сокет '/run/mysqld/mysqld.sock' (2)» в docker-compose up - PullRequest
3 голосов
/ 20 сентября 2019

Я пытаюсь запустить сервер через docker-compose up

Я получаю сообщение об ошибке:

2002, "Не удается подключиться к локальному серверу MySQL через сокет'/run/mysqld/mysqld.sock' (2) "

docker-compose.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

Dockerfile

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 log

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': '',

1 Ответ

1 голос
/ 21 сентября 2019

В настройках django вы оставляете хост базы данных как EMPTY, тогда значением по умолчанию будет localhost.Когда используется localhost, драйвер клиента mysql соединит сервер mysql с unix socket, а не tcp.

Так что в вашем случае вам нужно экспортировать unix socket в вашем контейнере mysql на том, а затем на django.Контейнер приложения использует этот том для предоставления доступа к unix socket.

. Далее вам нужно сделать следующее:

  1. Создать новую папку вручную, которая позже станет томом для совместного использования вашего unix.файл сокета

    (ВАЖНО: вы не можете полагаться на docker-compose для создания новой папки, вы столкнетесь с ошибкой разрешения)

    mkdir -p /tmp/slack_bot/mysqld && chmod -R 777 /tmp/slack_bot/mysqld
    
  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
    
  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/mysqld/mysqld.sock, как следующий, я не уверен, вставляете ли вы весь журнал, так как наиболее часто это может быть /var/run/mysqld/mysqld.sock, конечно, если ошибка /var/run/mysqld/mysqld.sock, то вы должны изменить приведенный выше пример на - /tmp/slack_bot/mysqld:/var/run/mysqld

    2002, "Не удается подключиться к локальному серверу MySQL черезсокет '/run/mysqld/mysqld.sock' (2) "

С вышеупомянутым теперь ваш веб-сервис может совместно использовать сокет unix в контейнере mysql.

Дополнительно, настройте HOST как db Я думаю, что может быть и другое решение, просто unix socket намного быстрее по сравнению с использованием tcp.

...