无法在 Docker Compose 中将 Flask 应用连接到 SQL Server 容器

Unable to connect Flask app to SQL Server container in Docker Compose

提问人:Christian Sugarol 提问时间:11/11/2023 最后编辑:Christian Sugarol 更新时间:11/11/2023 访问量:39

问:

我在使用 Docker Compose 将 Flask 应用程序连接到 SQL Server 容器时遇到问题。init.sql 脚本似乎没有创建预期的数据库,我的 Flask 应用程序遇到登录超时错误。

以下是我的设置的简化概述:

#Docker Compose File (docker-compose.yml):

version: '3'

services:
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2019-latest
    environment:
      SA_PASSWORD: YourStrong@Passw0rd
      ACCEPT_EULA: Y
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "14500:1433"
    networks:
      - app_network

  app:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - sqlserver
    networks:
      - app_network

networks:
  app_network:
    driver: bridge

#Flask Application (app.py):

# app.py

from flask import Flask, request, jsonify
import pyodbc

app = Flask(__name__)

# SQL Server connection config
server = 'sqlserver' 
database = 'recipes'
username = 'SA'
password = 'YourStrong@Passw0rd' 


conn = pyodbc.connect('DRIVER=ODBC Driver 17 for SQL Server; SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = conn.cursor()

# Create recipes table
cursor.execute("CREATE TABLE recipes (id INT IDENTITY(1,1) PRIMARY KEY, name VARCHAR(100), instructions VARCHAR(1000))")

@app.route("/recipes", methods=['POST'])
def add_recipe():
  name = request.json['name']
  instructions = request.json['instructions']
  
  cursor.execute("INSERT INTO recipes (name, instructions) VALUES (?, ?)", (name, instructions))
  conn.commit()
  
  return jsonify({
    "message": "Recipe added successfully!"
  })

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')
#init.sql

USE master;
CREATE DATABASE TestDB;

但是,当我运行 Flask 应用程序时,我遇到以下错误:

2023-11-11 19:12:30 pyodbc.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')

我已验证在通过 SQL Server Management Studio 连接时是否创建了数据库,但 Flask 应用无法连接,并且未创建要在 init.db 中创建的数据库。

我也在使用,之后我将用它来创建一个图像docker-compose builddocker-compose up

有人可以指导我解决可能导致此问题的原因以及如何解决它吗?任何帮助都是值得赞赏的。

python sql-server docker-compose

评论

0赞 Simon Crowe 11/11/2023
我不打算添加答案,因为我不熟悉这个堆栈,但我可以看到您正在为数据库容器使用非标准端口 (14500)。我的猜测是您需要在连接字符串中包含此端口。旁注:如果您使用的是 python,为什么不使用 PostgreSQL 和 psycopg2 作为驱动程序?(它都是开源的,有更好的文档记录和广泛使用)。
0赞 Christian Sugarol 11/11/2023
我们需要将 MSSQL 用于数据库
0赞 Simon Crowe 11/11/2023
啊,好吧,只是以为我会提到一个替代方案。
0赞 siggemannen 11/11/2023
您是否尝试过:作为服务器名称?sqlserver,14500
0赞 AlwaysLearning 11/11/2023
@siggemannen端口 14500 是 Docker 主机上发布的端口(即:host.docker.internal)。同一 Docker 网络中的其他容器应该能够使用 SQL Server 容器的公开端口 1433。

答: 暂无答案