приложению flask не удается подключиться к контейнеру mysql

#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 дважды, ожидая минуту или две между вызовами, сработает ли это во второй раз?