Невозможно подключиться к хосту mysql из приложения фляги в докере compose - PullRequest
0 голосов
/ 03 декабря 2018

Я знаю, что это может быть помечено как дубликат вопроса, но я в основном перепробовал все, что получил в Интернете.

Я разработал простой REST API с бэкэндом mysql.Чтобы запустить приложение, я пытаюсь использовать docker compose, чтобы вывести их обоих, но мой, когда я поднимаю свой контейнер, пытается запустить db.create_all из файла, но он говорит, что не может подключиться.Ниже приведены мои соответствующие файлы:

Dockerfile:

FROM python:latest

## make a local directory
RUN mkdir /flask_rest_service

WORKDIR /flask_rest_service

ADD . .

RUN pip install -r requirements.txt

EXPOSE 8080

CMD python code/sqlinit.py && python code/app.py

sqlinit.py:

from models.user_model import UserModel
from app import app, db


def main():
    with app.app_context():
        db.create_all()
        admin = UserModel(username='admin', password='admin', email='subhayan.here@gmail.com')
        admin.save_to_db()



if __name__ == "__main__":
    main()

Файл Docker compose.yml:

version: '2'
services:
  web:
    build: .
    ports:
      - "8080:8080"
    container_name: web-service
    depends_on:
      - db
    links:
      - db
  db:
    image: mysql:latest
    restart: always
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: restapi

файл settings.py:

import os
from datetime import timedelta

SECRET_KEY = os.urandom(24)
DEBUG = True
PROPAGATE_EXCEPTIONS = True
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:rootpass@db/restapi'
JWT_ACCESS_TOKEN_EXPIRES = timedelta(seconds=60)
JWT_REFRESH_TOKEN_EXPIRES = timedelta(seconds=300)
JWT_BLACKLIST_ENABLED = True
JWT_BLACKLIST_TOKEN_CHECKS = ['access', 'refresh']

Из того, что я вижу, похоже, что sqlinit.py - это проблема.Но я не знаю, как это решить.Когда мое приложение запускается, в базе данных должен быть пользователь-администратор, поэтому я должен его использовать.

1 Ответ

0 голосов
/ 04 декабря 2018

Для вашего сервиса и файла композиции базы данных я также предоставил бы порт mysql, чтобы ваше приложение на python могло получить доступ к стандартному контейнеру mysql с портом TCP по умолчанию 3306.

Так что ваш compose.yml будетвыглядеть так:

version: '2'
services:

  ...

  db:
    image: mysql:latest
    ports:
      - "3306:3306"
    restart: always
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: restapi

Надеюсь, это поможет!

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