#python-3.x #docker #flask #docker-compose #flask-sqlalchemy
#python-3.x #docker #flask #docker-compose #flask-sqlalchemy
Вопрос:
Я пишу приложение, в котором мой контейнер flask docker будет подключаться к контейнеру mysql. вот моя структура папок
.
├── README.md
├── config
│ ├── __init__.py
│ ├── dev_config.py
│ └── test_config.json
├── docker-compose.yml
├── manage.py
├── my_app
│ ├── Dockerfile
│ ├── __init__.py
│ ├── database
│ │ ├── __init__.py
│ │ ├── database.db
│ │ ├── init_db.py
│ │ └── inventory_models.py
│ ├── requirements.txt
│ ├── static
│ │ └── css
│ │ └── style.css
│ ├── templates
│ │ ├── base.html
│ │ └── index.html
│ └── views
│ ├── __init__.py
│ ├── auth.py
│ └── inventory_views.py
└── tests
Мое Dockerfile
содержимое
FROM python:3.6
EXPOSE 5000
WORKDIR /my_app
COPY requirements.txt /my_app
RUN /usr/local/bin/python -m pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . /my_app
WORKDIR /my_app
CMD python manage.py runserver --host 0.0.0.0
мой docker-compose.yml
version: "3"
services:
db:
image: mariadb
container_name: db
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=test
volumes:
- /db_data/:/var/lib/mysql
my_app:
build: ./my_app
container_name: my_app_container
tty: true
stdin_open: true
image: my_app_image_2
links:
- "db:mysql"
ports:
- "5000:5000"
volumes:
- /Documents/flask_my_app/:/my_app
depends_on:
- db
Всякий раз, когда я запускаю docker-compose up
БД, она появляется правильно и my_app_container
завершается docker logs my_app_container
, выводится следующее.
...
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect
return dialect.connect(*cargs, **cparams)
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 509, in connect
return self.dbapi.connect(*cargs, **cparams)
File "/usr/local/lib/python3.6/site-packages/MySQLdb/__init__.py", line 130, in Connect
return Connection(*args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/MySQLdb/connections.py", line 185, in __init__
super().__init__(*args, **kwargs2)
MySQLdb._exceptions.OperationalError: (2002, "Can't connect to MySQL server on 'mysql' (115)")
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 1, in <module>
from my_app import app
File "/my_app/my_app/__init__.py", line 10, in <module>
from my_app.views.inventory_views import inventory_bp
File "/my_app/my_app/views/inventory_views.py", line 3, in <module>
from my_app.database.inventory_models import InventoryItems
File "/my_app/my_app/database/__init__.py", line 5, in <module>
db.create_all()
File "/usr/local/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 1039, in create_all
self._execute_for_all_tables(app, bind, 'create_all')
File "/usr/local/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 1031, in _execute_for_all_tables
op(bind=self.get_engine(app, bind), **extra)
...
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 778, in _checkout
fairy = _ConnectionRecord.checkout(pool)
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 495, in checkout
rec = pool._do_get()
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool/impl.py", line 140, in _do_get
self._dec_overflow()
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
with_traceback=exc_tb,
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
raise exception
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool/impl.py", line 137, in _do_get
return self._create_connection()
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 309, in _create_connection
return _ConnectionRecord(self)
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 440, in __init__
self.__connect(first_connect_check=True)
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 661, in __connect
pool.logger.debug("Error on connect(): %s", e)
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
with_traceback=exc_tb,
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
raise exception
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 656, in __connect
connection = pool._invoke_creator(self)
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect
return dialect.connect(*cargs, **cparams)
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 509, in connect
return self.dbapi.connect(*cargs, **cparams)
File "/usr/local/lib/python3.6/site-packages/MySQLdb/__init__.py", line 130, in Connect
return Connection(*args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/MySQLdb/connections.py", line 185, in __init__
super().__init__(*args, **kwargs2)
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (2002, "Can't connect to MySQL server on 'mysql' (115)")
(Background on this error at: http://sqlalche.me/e/13/e3q8)
Если я вручную запускаю docker, запустив docker start my_app_contianer
его, он работает нормально. Почему мой docker-compose не работает?
Комментарии:
1. У вашего контейнера базы данных есть имя
db
, и вы должны настроить конфигурацию своего приложения так, чтобы оно использовалось в качестве имени хоста.links:
не используются в современном Docker. Сеть в Compose содержит более подробную информацию об общей сетевой среде.2. я изменил
db
mysql
и попытался удалить раздел ссылок, сlinks: - mysql
помощью, сlinks: - "mysql:mysql"
помощью, но со всеми комбинациями я получаю ту же ошибку3. Где вы настраиваете расположение сервера базы данных? Если вы запустите
docker-compose up -d
дважды, ожидая минуту или две между вызовами, сработает ли это во второй раз?