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?