Невозможно соединиться с MySQL в файле Docker: невозможно подключиться к локальному MySQL серверу через сокет '/var/run/mysqld/mysqld.sock' - PullRequest
0 голосов
/ 16 апреля 2020

Моя команда разработала приложение Flask, которое использует Selenium для доступа к нескольким веб-сайтам и подключено к базе данных MySQL. Все три работают в отдельных Docker контейнерах.

Однако при тестировании моего Flask приложения я получаю следующую ошибку:

  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)  
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)    
  File "/usr/local/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()        
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/app/api.py", line 28, in data_takedown
    cursor, connection = get_db_connection()
  File "/app/api.py", line 20, in get_db_connection
    connection = MySQLdb.connect("privacy-mysql", "root", "DockerPasswort!", "privacydatabase")
  File "/usr/local/lib/python3.8/site-packages/MySQLdb/__init__.py", line 84, in Connect
    return Connection(*args, **kwargs)  
  File "/usr/local/lib/python3.8/site-packages/MySQLdb/connections.py", line 179, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
MySQLdb._exceptions.OperationalError: (2005, "Unknown MySQL server host 'privacy-mysql' (-2)")
172.21.0.1 - - [16/Apr/2020 09:19:11] "POST /data_remove HTTP/1.1" 500 -   

Это настройка, которую я использовал в моем Visual Studio Code Windows Подсистема для Linux Терминала на моем Windows 10 компьютере:

docker run --name selenium-container -d -p 4444:4444 -p 5900:5900 -v Desktop:/dev/shm selenium/standalone-chrome-debug
docker run -d --name privacy-mysql -e MYSQL_ROOT_PASSWORD=DockerPasswort! -e MYSQL_DATABASE=privacy-database -v "$(pwd)/db/db_records:/var/lib/mysq"l -v "$(pwd)/db/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d" --network privacy-network -dit -p 3306:3306 mysql:latest --default-authentication-plugin=mysql_native_password
docker exec -it privacy-mysql bash
docker build -t privacy_api_image .
docker run -dit --name=privacy_api -e FLASK_APP=api.py -p 5000:5000 -v "$(pwd):/app" --network privacy-network privacy_api_image
docker logs -f privacy_api

Обратите внимание, что privacy_api - это контейнер для приложения Flask, который можно запустить, но при тестировании выдает ошибку .

При запуске docker exec -it privacy-mysql bash я впервые получил такой вывод: Container da63bc4015c9cdb5cac71e8e0a9a8707491decdf2973f75ce28ee3d8e255259c is not running. Таким образом, я следовал этим инструкциям для запуска контейнера mysql:

docker run -d --name privacy-mysql -e MYSQL_ROOT_PASSWORD=DockerPasswort! -e MYSQL_DATABASE=privacy-database -v "$(pwd)/db/db_records:/var/lib/mysq"l -v "$(pwd)/db/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d" --network privacy-network -dit -p 3306:3306 mysql:latest --default-authentication-plugin=mysql_native_password
docker exec -it privacy-mysql bash
docker commit privacy-mysql myimage
sha256:420025006baadb7ce93d348e85993cad1ca29575de01f1977e604aca87f74879
docker run --name privacy myimage

Это приводит к следующему выводу терминала:

2020-04-16 09:17:42+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian10 started.
2020-04-16 09:17:42+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-04-16 09:17:42+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian10 started.
2020-04-16 09:17:42+00:00 [Note] [Entrypoint]: Initializing database files      
2020-04-16T09:17:42.408985Z 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. 
2020-04-16T09:17:42.409037Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.19) initializing of server in progress as process 43
2020-04-16T09:17:44.406732Z 5 [Warning] 
[MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
2020-04-16 09:17:47+00:00 [Note] [Entrypoint]: Database files initialized       
2020-04-16 09:17:47+00:00 [Note] [Entrypoint]: Starting temporary server        
2020-04-16T09:17:47.327022Z 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. 
2020-04-16T09:17:47.327105Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 93     
2020-04-16T09:17:47.794578Z 0 [Warning] 
[MY-010068] [Server] CA certificate ca.pem is self signed.
2020-04-16T09:17:47.798719Z 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.
2020-04-16T09:17:47.813848Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.19'  
socket: '/var/run/mysqld/mysqld.sock'  port: 0  MySQL Community Server - GPL.   
2020-04-16 09:17:47+00:00 [Note] [Entrypoint]: Temporary server started.        
2020-04-16T09:17:47.903473Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock'
Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
2020-04-16 09:17:49+00:00 [Note] [Entrypoint]: Creating database privacy-database

2020-04-16 09:17:49+00:00 [Note] [Entrypoint]: Stopping temporary server        
2020-04-16T09:17:50.002102Z 11 [System] 
[MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.19).
2020-04-16T09:17:51.994762Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.19)  MySQL Community Server - GPL.
2020-04-16 09:17:52+00:00 [Note] [Entrypoint]: Temporary server stopped

2020-04-16 09:17:52+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.

2020-04-16T09:17:52.276573Z 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. 
2020-04-16T09:17:52.276651Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 1      
2020-04-16T09:17:52.687390Z 0 [Warning] 
[MY-010068] [Server] CA certificate ca.pem is self signed.
2020-04-16T09:17:52.692123Z 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.
2020-04-16T09:17:52.705752Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.19'  
socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.2020-04-16T09:17:52.821171Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060

Однако это все еще приводит к той же ошибке Unknown MySQL server host 'privacy-mysql' (-2), что и выше.

При работе: docker run -it 04683a5f1dfce359cf3b66fa82af4b016d19a8ee527c204354ff9c49249a915a bash Я мог получить доступ к bash, но это показывает, что, похоже, проблема с сокетом?:

root@70c4f452ed74:/# mysql -uroot -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
root@70c4f452ed74:/# /var/run/mysql start
bash: /var/run/mysql: No such file or directory

Что еще я мог сделать, чтобы запустить mysql? Спасибо за вашу помощь!

----------------------------- РЕДАКТИРОВАТЬ 1 ------- ---------------------------------------

Я тоже пробовал запустить ( обратите внимание на использование порта 33060 вместо 3306):

docker run --name selenium-container -d -p 4444:4444 -p 5900:5900 -v Desktop:/dev/shm selenium/standalone-chrome-debug
docker run -d --name privacy-mysql -e MYSQL_ROOT_PASSWORD=DockerPasswort! -e MYSQL_DATABASE=privacy-database -v "$(pwd)/db/db_records:/var/lib/mysq"l -v "$(pwd)/db/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d" --network privacy-network -dit -p 33060:3306 mysql:latest --default-authentication-plugin=mysql_native_password
docker commit privacy-mysql myimage
docker run --name privacy myimage
docker build -t privacy_api_image .
docker run -dit --name=privacy_api -e FLASK_APP=api.py -p 5000:5000 -v "$(pwd):/app" --network privacy-network privacy_api_image
docker logs -f privacy_api

Но это приводит к той же проблеме.

------------------- --- РЕДАКТИРОВАТЬ 2 -------------------------------------------- Я только что заметил, что мой каталог root выглядит следующим образом, может быть, в этом причина ошибки:

/root
----/main_api (folder)
    ---/api.py
    ---/Dockerfile
    ---/db_records  (folder)
    ---/docker_entrypoint-initdb.d  (folder)
---/db  (folder)
    ---/db_records  (folder)
    ---/docker_entrypoint-initdb.d  (folder)

Может быть, одна часть приложения смотрит в неправильную папку БД?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...