Docker 中用于 Web 上 Flutter 的 Dart 服务器

Posted

技术标签:

【中文标题】Docker 中用于 Web 上 Flutter 的 Dart 服务器【英文标题】:Dart Server for Flutter on Web in Docker 【发布时间】:2021-05-17 17:37:10 【问题描述】:

我正在尝试构建一个可以为 Flutter Web 应用程序提供服务的 dart 服务器。我尝试了几种不同的方法,构建from scratch,使用shelf(和shelf_static),最后是GetX,但我无法让它们在docker容器中运行。例如,我目前有一个简单的结构:

-myApp/
  -web/
  -Dockerfile
  -pubspec.yaml
  -server.dart

我使用了基本的 Flutter 演示应用程序(带有浮动按钮和计数器),添加了 Web 支持,然后做了 $ flutter build web,并获取了 build/web 文件夹并将其复制到这里作为 web.xml 文件。 pubspec 只包含 get_server 和 build_runner,server.dart 文件只有:

import 'package:get_server/get_server.dart';
void main() => runApp(GetServer(home: FolderWidget('web')));

然后我的 Dockerfile 看起来像这样(基于this github repo):

################
FROM google/dart:2.10

RUN apt -y update && apt -y upgrade

WORKDIR /app
COPY pubspec.yaml /app/pubspec.yaml
RUN dart pub get
COPY . .
RUN dart pub get --offline

RUN dart pub run build_runner build --delete-conflicting-outputs
RUN dart compile exe /app/server.dart -o /app/server

########################
FROM subfuzion/dart:slim
COPY --from=0 /app /app
EXPOSE 8080
ENTRYPOINT ["/app/server"]

如果我从命令行运行服务器:

$ dart server.dart

它运行完美。但如果我构建 docker 并运行它:

$ docker build -t myApp .
$ docker run -d -p 8080:8080 myapp

它只是说找不到该页面。有谁知道我做错了什么?或者有关于如何使用 Dart 服务器托管 Flutter Web 应用程序的建议(不一定是 GetX)。

【问题讨论】:

【参考方案1】:

原来我只是一个白痴,并试图从我的计算机上与我的 docker 容器中相同的目录提供网站服务(惊喜!那不起作用)。 我已将我的 server.dart 文件更改为:

import 'package:get_server/get_server.dart';
void main() => runApp(GetServer(home: FolderWidget('./app/web')));

我的 docker 文件现在是:

################
FROM google/dart:2.10

WORKDIR /app
COPY pubspec.yaml /app/pubspec.yaml
RUN dart pub get
COPY . .
RUN dart pub get --offline
RUN dart compile exe bin/server.dart -o bin/server

########################
FROM subfuzion/dart:slim
COPY --from=0 /app/bin/server /app/bin/server
COPY --from=0 /app/web /app/web
EXPOSE 8080
ENTRYPOINT ["/app/bin/server"]

它就像一个魅力。

【讨论】:

以上是关于Docker 中用于 Web 上 Flutter 的 Dart 服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何重新打包 Flutter 插件以用于 Flutter Web?

Flutter 中用于 Web、移动和桌面应用程序的视频播放器?

带有 Flutter web 的 localhost 无法与 docker 一起使用

有没有办法在“Flutter web”应用程序的代码中获取用于启动应用程序的 URL?

在 Flutter 网站上展示广告(flutter web app)

用于 Web 状态管理的 Flutter