#python #mysql #docker #flask #docker-compose
Вопрос:
Я запускаю докер, состоящий из колбы и контейнера MySQL, но сталкиваюсь с этой ошибкой » MySQL.connector.errors.Ошибка интерфейса: 2003: Не удается подключиться к серверу MySQL на ‘db:3306’ (имя пользователя или службы неизвестно)»
версия докера : 20.10.7
пожалуйста, помогите мне решить эту проблему
структура моего проекта такова:
flaskProject6/
├── app/
│ ├── app.py
│ |── Dockerfile
│ │── requirements.txt
│──db/
│ |── init.sql
├── docker-compose.yml
requirements.txt
Flask==2.0.1
mysql_connector
app.py
from typing import List, Dict
from flask import Flask
import mysql.connector
import json
app = Flask(__name__)
def favorite_colors() -> List[Dict]:
config = {
'user': 'root',
'password': 'root',
'host':'db',
'port': '3306',
'database': 'knights'
}
connection = mysql.connector.connect(**config)
cursor = connection.cursor()
cursor.execute('SELECT * FROM favorite_colors')
results = [{name: color} for (name, color) in cursor]
cursor.close()
connection.close()
return results
@app.route('/')
def index() -> str:
return json.dumps({'favorite_colors': favorite_colors()})
if __name__ == '__main__':
app.run(host='0.0.0.0')
Докерфайл
# Use an official Python runtime as an image
FROM python:3.9.4
# The EXPOSE instruction indicates the ports on which a container
# will listen for connections
# Since Flask apps listen to port 5000 by default, we expose it
EXPOSE 5000
# Sets the working directory for following COPY and CMD instructions
# Notice we haven’t created a directory by this name - this instruction
# creates a directory with this name if it doesn’t exist
WORKDIR /app
# Install any needed packages specified in requirements.txt
COPY requirements.txt /app
RUN pip3 install -r requirements.txt
# Run app.py when the container launches
COPY app.py /app
CMD python app.py
init.sql
CREATE DATABASE IF NOT EXISTS knights;
use knights;
CREATE TABLE favorite_colors (
name VARCHAR(20),
color VARCHAR(10)
);
INSERT INTO favorite_colors
(name, color)
VALUES
('Lancelot', 'blue'),
('Galahad', 'yellow');
docker-compose.yml
services:
app:
build: ./app
depends_on:
- db
ports:
- "5000:5000"
db:
image: mysql:8.0.26
ports:
- "32000:3306"
environment:
MYSQL_ROOT_USER: root
MYSQL_ROOT_PASSWORD: root
MYSQL_PASSWORD: root
MYSQL_DATABASE: knights
volumes:
- ./db:/docker-entrypoint-initdb.d/:ro
restart: always
output:
in Building step:
C:UsersKarthikDesktopflaskProject6>docker-compose up --build
Creating network "flaskproject6_default" with the default driver
Building app
[ ] Building 15.6s (10/10) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 32B 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.9.4 15.0s
=> [internal] load build context 0.2s
=> => transferring context: 63B 0.0s
=> [1/5] FROM docker.io/library/python:3.9.4@sha256:03ac9e7e04a401af550774bc974c03d02fd0e74c8a185f7ab902e1be99d1ec98 0.0s
=> CACHED [2/5] WORKDIR /app 0.0s
=> CACHED [3/5] COPY requirements.txt /app 0.0s
=> CACHED [4/5] RUN pip3 install -r requirements.txt 0.0s
=> CACHED [5/5] COPY app.py /app 0.0s
=> exporting to image 0.2s
=> => exporting layers 0.0s
=> => writing image sha256:3bf215f9a31f612a8d9c75ac845731ccda8654fc189f7ae2fce7baf7d4086403 0.0s
=> => naming to docker.io/library/flaskproject6_app 0.0s
Creating flaskproject6_db_1 ... done
Creating flaskproject6_app_1 ... done
Attaching to flaskproject6_db_1, flaskproject6_app_1
db_1 | 2021-08-16 09:13:42 00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.26-1debian10 started.
db_1 | 2021-08-16 09:13:43 00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
db_1 | 2021-08-16 09:13:43 00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.26-1debian10 started.
db_1 | 2021-08-16 09:13:43 00:00 [Warn] [Entrypoint]: MYSQL_PASSWORD specified, but missing MYSQL_USER; MYSQL_PASSWORD will be ignored
db_1 | 2021-08-16 09:13:43 00:00 [Note] [Entrypoint]: Initializing database files
db_1 | 2021-08-16T09:13:43.466536Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.26) initializing of server in progress as process 44
db_1 | 2021-08-16T09:13:43.520113Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
app_1 | * Serving Flask app 'app' (lazy loading)
app_1 | * Environment: production
app_1 | WARNING: This is a development server. Do not use it in a production deployment.
app_1 | Use a production WSGI server instead.
app_1 | * Debug mode: off
app_1 | * Running on all addresses.
app_1 | WARNING: This is a development server. Do not use it in a production deployment.
app_1 | * Running on http://172.22.0.3:5000/ (Press CTRL C to quit)
db_1 | 2021-08-16T09:13:45.953897Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
db_1 | 2021-08-16T09:13:49.561880Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
db_1 | 2021-08-16T09:13:49.562474Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
db_1 | 2021-08-16T09:13:49.794492Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initia
lize-insecure option.
db_1 | 2021-08-16 09:13:57 00:00 [Note] [Entrypoint]: Database files initialized
db_1 | 2021-08-16 09:13:57 00:00 [Note] [Entrypoint]: Starting temporary server
db_1 | 2021-08-16T09:13:57.883021Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.26) starting as process 93
db_1 | 2021-08-16T09:13:57.913341Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
db_1 | 2021-08-16T09:13:58.259382Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
db_1 | 2021-08-16T09:13:59.028875Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
db_1 | 2021-08-16T09:13:59.029924Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
db_1 | 2021-08-16T09:13:59.046457Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
db_1 | 2021-08-16T09:13:59.047374Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this
channel.
db_1 | 2021-08-16T09:13:59.061686Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible t
o all OS users. Consider choosing a different directory.
db_1 | 2021-08-16T09:13:59.321041Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock
db_1 | 2021-08-16T09:13:59.322457Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.26' socket: '/var/run/mysqld/mysqld.so
ck' port: 0 MySQL Community Server - GPL.
db_1 | 2021-08-16 09:13:59 00:00 [Note] [Entrypoint]: Temporary server started.
db_1 | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
db_1 | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
db_1 | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
db_1 | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
db_1 | 2021-08-16 09:14:09 00:00 [Note] [Entrypoint]: Creating database knights
db_1 |
db_1 | 2021-08-16 09:14:09 00:00 [Note] [Entrypoint]: /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql
db_1 |
db_1 |
db_1 | 2021-08-16 09:14:09 00:00 [Note] [Entrypoint]: Stopping temporary server
db_1 | 2021-08-16T09:14:09.597391Z 12 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.26).
db_1 | 2021-08-16T09:14:11.561783Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.26) MySQL Community Server - GPL.
db_1 | 2021-08-16 09:14:11 00:00 [Note] [Entrypoint]: Temporary server stopped
db_1 |
db_1 | 2021-08-16 09:14:11 00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
db_1 |
db_1 | 2021-08-16T09:14:12.524304Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.26) starting as process 1
db_1 | 2021-08-16T09:14:12.537075Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
db_1 | 2021-08-16T09:14:12.946871Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
db_1 | 2021-08-16T09:14:13.229828Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
db_1 | 2021-08-16T09:14:13.230032Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
db_1 | 2021-08-16T09:14:13.231501Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
db_1 | 2021-08-16T09:14:13.231876Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this
channel.
db_1 | 2021-08-16T09:14:13.239435Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible t
o all OS users. Consider choosing a different directory.
db_1 | 2021-08-16T09:14:13.261895Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx
.sock
db_1 | 2021-08-16T09:14:13.262051Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.26' socket: '/var/run/mysqld/mysqld.so
ck' port: 3306 MySQL Community Server - GPL.
я также попытался использовать run
PS C:UsersKarthik> docker run -p 8085:5000 flaskproject6_app
* Serving Flask app 'app' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on all addresses.
WARNING: This is a development server. Do not use it in a production deployment.
* Running on http://172.17.0.2:5000/ (Press CTRL C to quit)
[2021-08-16 07:30:40,748] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/mysql/connector/network.py", line 482, in open_connection
addrinfos = socket.getaddrinfo(self.server_host,
File "/usr/local/lib/python3.9/socket.py", line 953, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 2070, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1515, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1513, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1499, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
File "/app/app.py", line 30, in index
return json.dumps({'favorite_colors': favorite_colors()})
File "/app/app.py", line 18, in favorite_colors
connection = mysql.connector.connect(**config)
File "/usr/local/lib/python3.9/site-packages/mysql/connector/__init__.py", line 179, in connect
return MySQLConnection(*args, **kwargs)
File "/usr/local/lib/python3.9/site-packages/mysql/connector/connection.py", line 95, in __init__
self.connect(**kwargs)
File "/usr/local/lib/python3.9/site-packages/mysql/connector/abstracts.py", line 716, in connect
self._open_connection()
File "/usr/local/lib/python3.9/site-packages/mysql/connector/connection.py", line 206, in _open_connection
self._socket.open_connection()
File "/usr/local/lib/python3.9/site-packages/mysql/connector/network.py", line 500, in open_connection
raise errors.InterfaceError(
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'db:3306' (-2 Name or service not known)
172.17.0.1 - - [16/Aug/2021 07:30:40] "GET / HTTP/1.1" 500 -
Комментарии:
1. Возможно, вы можете добавить «depends_on: db», дождаться запуска контейнера mysql, затем запустить контейнер flask, см. Также docs.docker.com/compose/compose-file/compose-file-v2
2. Спасибо @frank_lee, но я подал заявление, как вы сказали, это не подходит для моей проблемы
3. Вы
docker-compose up -d
хотите запустить свои сервисы? Похоже, что вы используетеdocker run
4. нет, я использовал docker-compose up-build, и я подаю в суд на версию 3
5. как насчет того, чтобы добавить
restart: always
в свойapp
вdocker-compose.yml
?
Ответ №1:
Я получил решение, изменив версию изображения с 8.0.26 на mysql:5.6