语境

I am trying to create a Dart server with the library shelf.
I want it a bit scalable in order to get to production when my project will be ready.

为了便于产品发布,我决定使用Docker以便于部署.


DART盘架服务器

这是我的文档文件:

# Use latest stable channel SDK.
FROM dart:stable AS build

# Resolve app dependencies.
WORKDIR /app
COPY pubspec.* ./
RUN dart pub get

# Copy app source code (except anything in .dockerignore) and AOT compile app.
COPY . .
RUN dart compile exe bin/server.dart -o bin/server

# Build minimal serving image from AOT-compiled `/server`
# and the pre-built AOT-runtime in the `/runtime/` directory of the base image.
FROM scratch
COPY --from=build /runtime/ /
COPY --from=build /app/bin/server /app/bin/

# Start server.
EXPOSE 8080
CMD ["/app/bin/server"]

(它是Shelf自述文件提供的基本dockerfile)


Docker-使用数据库编写文件

Now, I need a database.
I put it in a separate container.
Here is my docker-compose.yaml file :

version: "3.7"
services:
  db:
    restart: always
    image: mysql
    environment:
      MYSQL_USER: admin
      MYSQL_PASS: secret
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_PASSWORD: secret
      MYSQL_DATABASE: mydatabase
    # volumes:
    #   - toast-datavolume:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - mynetwork

  server:
    build: .
    ports:
      - "8000:8080"
    depends_on:
      - db
    environment:
      - MYSQL_HOST=db
    links:
      - db:mysql
    networks:
      - mynetwork

networks:
  mynetwork:
# volumes:
#   toast-datavolume:

(我注释掉了持久性部分,因为我只想让它先起作用)


DART代码

最后,下面是负责连接的DART代码:

try {
  print('try');
  var settings = ConnectionSettings(
    host: 'db',
    port: 3306,
    user: 'admin',
    password: 'secret',
    db: 'mydatabase',
    timeout: Duration(seconds: 30),
  );
  var conn = await MySqlConnection.connect(settings);
  var result = await conn.query('insert into users (name, email, age) values (?, ?, ?)', ['Bob', 'bob@bob.com', 25]);

  return 1;
} catch (exception) {
  print(exception);
  return -1;
}

误差率

现在,当我启动容器时,一切都正常进行.然而,当我try 启动这部分代码时(使用cURL请求,这里由上面的一些代码重定向),下面是我的异常(在server个docker日志(log)上):

2023-06-07 11:45:14 2023-06-07T09:45:14.465441  0:00:00.011712 POST    [400] /register
2023-06-07 11:46:42 try
2023-06-07 11:46:42 SocketException: Broken pipe (OS 误差率: Broken pipe, errno = 32), address = db, port = 33206

The POST line shows my curl command.
The second line is my print('try') line.

以下是我已经try 过的:

  • 删除docker-compose.yaml中的network以使用默认网络
  • 在我的DART代码中使用mysql://db:3306作为主机
  • 从本地登录到我的MySQL容器(工作正常,所以问题出在DART服务器和MySQL服务器之间的连接)
  • 我try 了很多我不记得的事情,因为我花了两天的时间才做到了这一点.

谢谢你的帮助!

推荐答案

您的所有坞站网络设置看起来都正确.您应该不需要链接条目FWIW,但它不会有任何伤害.您正在使用的mysql1程序包可能与最新版本的MySQL服务器有问题.我根据你的帖子,用我最好的猜测复制了你的设置,得到了一个"数据包乱序"错误,这让我来到了Flutter mysql1 got packets out of order个地方.我将mysql1程序包交换为MySQL_CLIENT,然后能够成功连接.

Mysql相关问答推荐

括号在SQL查询中的作用?

MYSQL子查询

MySQL查询获取图书的唯一读取页面数

为什么我的带有索引字段和非索引字段的 Select 有时需要很长时间

SQL 请求:REPLACE 和通配符 %.如何做正确的事?

在 mySQL 中计算每日数组的每周指标

MySQL 关于 JSON 数组和子查询的问题

如何找到每个user_id每个产品的买家类型数量?

MYSQL "Like" 正向和反向词序查询

如何使用 express.js 和 react.js 删除连接表中的元素和关联元素

使用 DISTINCT 时无法从数据库中查询所有数据

如何知道 Select 查询花费了多少时间?

MYSQL LOAD DATA INFILE 语句适用于工作台,但不适用于 python

如果我创建一个没有主键的表然后添加一个主键,主键是聚集索引吗?

查询以查找可用时隙

如何在 Laravel 5.1 中获取数据库中的表列表

MySQL INSERT IF(自定义 if 语句)

Sequelize:销毁/删除表中的所有记录

MySQL:唯一字段需要是索引吗?

将数据库从 Postgres 迁移到 MySQL