语境
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 了很多我不记得的事情,因为我花了两天的时间才做到了这一点.
谢谢你的帮助!