Как соединить контейнер flask с контейнером mysql - PullRequest
0 голосов
/ 05 марта 2020

У меня уже работает контейнер mysql с именем «mysqlDemoStorage», открывающий порт 3306 для 0.0.0.0:3306. У меня также есть приложение flask, которое предоставляет страницу входа и страницу отображения таблиц. Приложение flask довольно хорошо работает на хосте. Страница входа подключается к таблице «user» в контейнере mysql, а страница отображения таблицы подключается к другой таблице, содержащей все данные для отображения. docker -компонентный файл, который я использовал для создания контейнера mysql, выглядит следующим образом:

version: '3'
services: 
    mysql:
        container_name: mysqlDemoStorage
        environment:
            MYSQL_ROOT_PASSWORD: "demo"
        command: 
            --character-set-server=utf8
        ports: 
            - 3306:3306
        image: "docker.io/mysql:latest"
        restart: always

Теперь я хочу докеризировать приложение flask, чтобы я мог по-прежнему просматривать приложение с хоста. Подробности о контейнере mysql:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
c48955b3589e        mysql:latest        "docker-entrypoint.s…"   13 days ago         Up 49 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp   mysqlDemoStorage

Докер-файл приложения flask, который я написал, выглядит следующим образом:

FROM python:latest
WORKDIR /storage_flask
ADD . /storage_flask
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python","run.py"]

Изображение flask может быть успешно выполнено встроенный, но когда я запускаю образ, мне не удается загрузить страницу. По-моему, причиной проблемы является файл init .py для запуска приложения flask, а именно:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager

app = Flask(__name__)    

app.config['SECRET_KEY'] = 'aafa4f8047ce31126011638be8530da6'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:demo@localhost:3306/storage'
db = SQLAlchemy(app)
bcrypt = Bcrypt(app)
login_manager = LoginManager(app)
login_manager.login_view = "login"
login_manager.login_message_category = 'info'

from storage_flask import routes

Я думал передать IP-адрес Контейнер mysql для контейнера flask в качестве строки конфигурации для подключения к БД. Но я не уверен, как это сделать. Может ли кто-нибудь помочь решить проблему? Спасибо

1 Ответ

0 голосов
/ 05 марта 2020

изменить эту строку

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:demo@localhost:3306/storage'

на

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:demo@mysql:3306/storage'

Вам также необходимо убедиться, что оба контейнера подключены к одной сети, для этого вам необходимо обновить docker -создать файл, похожий на файл ниже

version: '3.7'

networks:
  my_network_name:
    name: my_network_name
    external: false

services:
  mysql:
    container_name: mysqlDemoStorage
    environment:
      MYSQL_ROOT_PASSWORD: "demo"
    command:
      --character-set-server=utf8
    ports:
      - 3306:3306
    image: "docker.io/mysql:latest"
    restart: always
    networks:
      - my_network_name

второй файл

version: '3.7'

networks:
  my_network_name:
    name: my_network_name
    external: true

services:
  python_app:
    container_name: pythonDemoStorage
    ports:
      - 5000:5000
    image: "Myimage"
    restart: always
    networks:
      - my_network_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...