Flask + MySQL + PHP + Docker-Compose = Pain - PullRequest
       7

Flask + MySQL + PHP + Docker-Compose = Pain

0 голосов
/ 05 ноября 2018

Я пытаюсь создать простое приложение To do с docker-compose, имеющим 3 контейнера: один API Flask Rest с sqlalchemy и marshmallow, один PHP для вызова моего Rest-Api и одну базу данных MySQL. Ошибка, которую я получаю:

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, 
"Can't connect to MySQL server on 'db' ([Errno 111] Connection refused)") 
(Background on this error at: http://sqlalche.me/e/e3q8)

И я не могу вызвать остальные API из моего php-контейнера. Вот код с важными строками:

мой docker-compose.yml:

version: '3.1' #compose version

services: 
flaskapi-service:
 build: 
  context: ./restapi #relative to docker-compose file directory
  dockerfile: DOCKERFILE
 volumes: 
  - ./restapi:/usr/src/app #mounting
 ports:
  - 5001:5001 #host:container
 depends_on:
  - db
 restart: on-failure

db:
 image: mysql:latest
 restart: always
 environment:
  MYSQL_USER: username
  MYSQL_PASSWORD: password
  MYSQL_DATABASE: todo
  MYSQL_ROOT_PASSWORD: password
 ports:
   - "3306:3306"

php-page:
 build:
  context: ./frontend
  dockerfile: DOCKERFILE
 volumes:
  - ./frontend:/var/www/html #mount
 ports: 
  - 5002:80 #host:container
 depends_on: 
  - flaskapi-service 

мой отдых-API:

from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
import pymysql

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 
'mysql+pymysql://username:password@db:3306/todo'

#order matters: ORM before serialization tool
db = SQLAlchemy(app)
ma = Marshmallow(app)

как я называю rest-api из php:

 <?php
    $date_time = date('Y-m-d H:i:s');
    $data = array(
        'description' => $_POST['description'],
        'deadline' => $_POST['deadline'],
        'createdAt' => $date_time,
        'finished' => 'false'
    );

    $encodedJSON = json_encode($data);

    //Initiate cURL-handle
    $ch = curl_init();

    curl_setopt_array($ch, array(
        CURLOPT_URL => 'http://flaskapi-service/todo',
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => $encodedJSON,
        CURLOPT_HTTPHEADER => array('Content-Type: application/json')
    ));

    $result = curl_exec($ch);
    echo $result;
    curl_close($ch);
    header('Location: index.php');
 ?>

Любая помощь приветствуется, и правильный ответ помечается как правильный.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Я решил эту проблему, опустив последнюю версию образа MySQL до 5.7:

mysql:5.7

Я не имею ни малейшего понятия, почему это должно работать, поскольку возвращаемая ошибка должна быть чем-то, например, неправильной конфигурацией с моим докером и его сетью, и не должна иметь ничего общего с MySQL. Может быть, это кому-то помогает.

Редактировать: всегда проверяйте, работает ли ваш контейнер базы данных, прежде чем пытаться подключиться, так как docker compose запускает все контейнеры одновременно.

0 голосов
/ 05 ноября 2018

Вместо "@db" в вашем SQLALCHEMY_DATABASE_URI вам нужен фактический адрес, по которому вы можете найти контейнер db с вашего сервера.

Вы можете, например, узнать, что использует ваш док-компьютер ip

$ docker-machine ip

А затем замените этот IP в вашем URI. например,

'mysql+pymysql://username:password@192.168.0.123:3306/todo'

Они могут даже находиться на одном хосте, если все контейнеры и на одной машине, поэтому сделайте это:

'mysql+pymysql://username:password@localhost:3306/todo'

В этом обсуждении вы можете найти другие способы определения IP-адреса вашего экземпляра MySQL .

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