gpt4 book ai didi

mysql - Flask + MySQL + PHP + Docker-Compose = 痛苦

转载 作者:行者123 更新时间:2023-11-29 16:44:34 25 4
gpt4 key购买 nike

我正在尝试使用 docker-compose 构建一个简单的待办事项应用程序,该应用程序具有 3 个容器:一个带有 sqlalchemy 和 marshmallow 的 Flask Rest API、一个用于调用我的 Rest-Api 的 PHP 和一个 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)

而且我无法从我的 php 容器中调用我的其余 api。这是包含重要行的代码:

我的 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

我的rest-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)

我如何从 php 调用rest-api:

 <?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');
?>

感谢任何帮助,并将正确答案标记为正确。

最佳答案

您需要的是可以从服务器找到数据库容器的实际地址,而不是 SQLALCHEMY_DATABASE_URI 中的“@db”。

例如,您可以找出您的 docker 机器 IP 正在使用

$ docker-machine ip

然后替换 URI 中的该 IP。例如

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

如果所有容器都在同一台机器上,它们甚至可能位于同一主机上,因此请尝试一下:

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

您可以找到其他方法来确定 MySQL 实例的 IP 地址 in this discussion .

关于mysql - Flask + MySQL + PHP + Docker-Compose = 痛苦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53160608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com